JavaScript继承扩展功能

前端之家收集整理的这篇文章主要介绍了JavaScript继承扩展功能前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在Pro JavaScript设计模式的这个功能结束时,我有点麻烦了解IF子句:
function extend(subClass,superClass) {
    var F = function() {};
    F.prototype = superClass.prototype;
    subClass.prototype = new F();
    subClass.prototype.constructor = subClass;

    subClass.superclass = superClass.prototype;
    if(superClass.prototype.constructor == Object.prototype.constructor) {
        superClass.prototype.constructor = superClass;
    }
}

本书解释说,这些行确保超类的构造函数属性被正确设置,即使超类是Object类本身.然而,如果我省略这三行,并做如下:

function SubClass() {};
extend(SubClass,Object);

alert(Object.prototype.constructor == Object);

警报说“true”,这意味着超类的构造函数设置正确,即使没有最后三行.那么在什么条件下,这个IF语句是否有用呢?

谢谢.

解决方法

这两行尝试避免的问题通常在替换构造函数的原型属性生成,例如:
function Foo () {};
Foo.prototype = {
  bar: 'baz'
};

var foo = new Foo();
foo.constructor === Object; // true,but `constructor` should refer to Foo

functions objects are created,原型属性被初始化一个新的对象,它包含一个引用该函数本身的构造函数属性,例如:

function Bar () {};
var bar = new Bar();
bar.constructor === Bar; // true

当您将prototype属性替换为另一个对象时,该对象具有自己的构造函数属性,通常从其他构造函数继承,或者从Object.prototype继承.

var newObj = {};
newObj.constructor === Object;

推荐文章

> Constructors considered mildly confusing
> JavaScript Prototypal Inheritance

猜你在找的JavaScript相关文章