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

2018-06-07  本文已影响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

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

上一篇下一篇

猜你喜欢

热点阅读