javascript constructor.prototype继承另一个constructor.prototype

时间:2015-05-23 13:34:05

标签: javascript oop inheritance prototype

这是我的问题: 假设我有一个带有原型X的构造函数A(); 现在我有另一个构造函数B,我想从A继承。 所以我必须做这样的事情:B.prototype = Object.create(A.prototype);

但是为什么我不能调用B.prototype = A.prototype,因为Object.create(A.prototype)它是对A.prototype的eqaul?

或者不是调用Object.create我可以使用这样的函数:

function inherit(p) {
    function f(){};
    f.prototype = p;
    return new f();
}

然后B.prototype = inherit(A.prototype)

有什么区别? 为什么不能调用B.prototype = A.prototype?

2 个答案:

答案 0 :(得分:2)

这是因为如果你向B.prototype添加一些东西,你也会添加到A.prototype

  

但是为什么我不能称之为B.prototype = A.prototype   Object.create(A.prototype)它是否与A.prototype相同?

如果你B.prototype = A.prototype,那么两个原型都将指向相同的参考。如果您执行B.prototype = Object.create(A.prototype),那么B.prototype将仅采用A.prototype中的值,则引用不会相同。

所以,

B.prototype = A.prototype
B.prototype === A.prototype
// OUTPUT: true;

B.prototype = Object.create(A.prototype)
B.prototype === A.prototype
// OUTPUT: false;

修改

您可以使用generated typescript code example扩展而不使用Object.create

// b -> base class
// d -> new class
var __extends = function (d, b) {
    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
    function __() { this.constructor = d; }
    __.prototype = b.prototype;
    d.prototype = new __();
};

答案 1 :(得分:-1)

因为继承你需要将原型指向构造函数。 所以你可以做任何一个。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<input id=a value="rarlib">
<button>CHECK</button>
<div id=r></div>

或者

B.prototype = Object.create(A.prototype)