javascript --- 原型初探七日谈

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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(); // Hello
she2.say(); // Hello

如果我们检查一下这些对象的构造函数,会发现一切正常:

she1.constructor === her;  // true
she2.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;  // false
her.prototype.constructor = her;
new her().constructor === her; // true

 

当我们重写prototype对象的时候,一定要重置prototype的constructor属性。

技术分享  就是辣么酸爽

以上是关于javascript --- 原型初探七日谈的主要内容,如果未能解决你的问题,请参考以下文章

Repractise基础篇:Web应用开发七日谈

Javascript 面向对象编程初探--- 封装

JavaScript原型链

前端入门22-讲讲模块化

七日阅书1.注重实效《程序员修炼之道—从小工到专家》

一文让你搞懂javascript如何实现继承