注意这个方式下,实际上是完全替换了Person的prototype,这与上面Person.prototype.name方式还是有细微差异的,这是因为任何类型,Javascript引擎都会添加默认的prototype,在这个prototype中包含一个对构造函数的引用,即原型对象属性constructor,所以通常使用替代prototype方式时,我们需要手动加上constructor属性:
Person.prototype = { constructor: Person, name :'xfrog', Say:function(){ alert(this.name); } }
注意,由于prototype对于整个类型是共享的,那么在prototype中的引用类型可能会存在问题,前面的Say函数作为一个对象,也是引用类型,所以每个实例中的Say都指向原型对象中的同一个函数,这本身没有问题,也是我们使用原型的初衷,但对于其他引用对象,可能结果并不是我们想要的:
function Person(){ } Person.prototype = { name: 'xfrog', obj : { age: 18 }, Say : function(){ alert(this.obj.age); } }; var p1 = new Person(); var p2 = new Person(); p1.obj.age = 20; p1.Say(); p2.Say();
p2.Say返回的是20,这是因为obj属性作为原型属性是共享的,在内存中只存在一个实例,所以通过p1修改后,p2只能得到修改后的状态。如果要避免此情况,可将obj属性放到实例中:
function Person(){ this.obj = { age: 18 }; }
以上就是小编为大家带来的浅谈Javascript中的函数、this以及原型全部内容了,希望大家多多支持脚本之家~
您可能感兴趣的文章: