模拟编程语言中的类有以下几种方式:
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并没什么区别
网友评论