首页 > 代码库 > javascript --- 原型初探七日谈(三)
javascript --- 原型初探七日谈(三)
原型陷阱:
在处理原型问题上时,我们要注意两种行为。
1. 当我们对原型对象执行完全替换的时候,有可能会触发原型链的某种异常。
2. prototype.constructor 属性是不可靠的。
下面,我们新建一个构造函数,并创建两个对象:
var her = fucntion(){ this.name = ‘Anna‘;}var she1 = her();var she2 = her();
即使在对象she1和she2对象被创建之后,我们仍然可以对her()的原型添加属性,并且之前创建的这些对象也可以访问这些属性。
her.prototype.say = function(){ return ‘Hello‘}she1.say(); // Helloshe2.say(); // Hello
如果我们检查一下这些对象的构造函数,会发现一切正常:
she1.constructor === her; // trueshe2.constructor === her; // true
现在,我们用一个新对象覆盖掉该构造函数的原型对象:
her.prototype = { sex : ‘women‘, height : ‘170cm‘}
事实证明,原有对象不能访问这些新增属性了,但原有对象们与她们的构造函数还保持着一种神秘的联系:
she1.sex; // undefined
she1.say(); // Hello
而我们之后创建的对象使用的或访问的都是更新过后的prototype对象。
var a = her();a.say(); // a.say() is not defined;a.sex = ‘women‘;
这时候,新对象的constructor就不会在指向her()了,而是指向Object().
a.constructor; // function Object(){}
she1.constructor; // function her(){this.name = ‘Anna‘}
当然我们可以设置constructor属性的指向来解决上述异常:
function her(){};her.prototype = {};new her().constructor === her; // falseher.prototype.constructor = her;new her().constructor === her; // true
当我们重写prototype对象的时候,一定要重置prototype的constructor属性。
就是辣么酸爽
javascript --- 原型初探七日谈(三)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。