微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

原文地址:https://www.jb51.cc/js/153931.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐