美文网首页
2018-05-30 原型对象 模拟类

2018-05-30 原型对象 模拟类

作者: 忙于未来的民工 | 来源:发表于2018-06-07 18:06 被阅读0次

    模拟编程语言中的类有以下几种方式: 

    1:构造函数方式,在函数内部定义方法和属性

    2:原型链方式,将属性和方法都放在原型链上

    3:构造函数+原型链方式,属性在构造函数上,方法在原型上(最好的方法)

    1:构造函数方式

    funcation Persion (name) {

    this.name = name

    this.say = function () { eval('alert("this.name")')}

    }

    var p1 = new Persion('p1')

    var p2 = new Persion('p2')

    缺点: 每个对象都会创建函数对象

    2:原型函数方式

    functionPersion () {}

    Persion.prototype.name= 'p'

    Persion.prototype.say = function () {return this.name}

    var p1= new Persion()

    var p2= new Persion()

    p1.name= 'p1'

    console.log(p1.say()) // p1

    console.log(p2.say()) //p1

    缺点: 属性和方法都在原型函数上,会使这个构造函数生成的所有的对象共享这些属性和方法,改变一个其他的跟着改变,无法做到独立性

    3:原型函数方式2 混合的构造函数/原型方式

    functionPersion (name) {

    this.name = name

    }

    Persion.prototype.say = function () {return this.name}

    var p1= new Persion()

    var p2= new Persion()

    p1.name= 'p1'

    console.log(p1.say()) // p1

    console.log(p2.say()) //p1

    优点:完美的解决了多个对象共享属性的问题

    缺点:如果习惯了java的开发规范,看着会感觉很奇怪,因为在java中,构造函数是在类的内部的,所以有了下面这种写法

    4:原型函数方式3 动态原型方法

    function Persion (name) {

    this.name = name

    if (typeOf Persion._initialized === 'undefined') {

    Persion.prototype.say = function () {return this.name}

    Persion._initialized = true

    }

    var p1= new Persion()

    var p2= new Persion()

    p1.name= 'p1'

    console.log(p1.say()) // p1

    console.log(p2.say()) //p1

    上面这种方法可以符合java类的编写规范,然而实际上和原型函数2并没什么区别

    以上几种方法可以模拟面向对象编程语言中的类,推荐2或者3

    总结:模拟类时最好的方法是属性在构造函数中,函数在构造函数的原型对象上

    相关文章

      网友评论

          本文标题:2018-05-30 原型对象 模拟类

          本文链接:https://www.haomeiwen.com/subject/fnyxsftx.html