我一直认为从其他函数继承原型时,Object.create(basefunc.prototype)
是可行的方法。另一种选择是new basefunc()
,缺点是调用基础构造函数。
但是简单地设置thefunc.protoype = basefunc.prototype
会有什么缺点?
请考虑以下代码段:
function foo(){
}
foo.prototype.blah = 1;
function bar(){
}
bar.prototype = foo.prototype; // instead of Object.create(foo.prototype)
// or new foo()
bar.prototype.constructor = bar;
bar.prototype.bleh = 1;
console.log(new bar()); // bar {blah: 1, bleh: 1}
答案 0 :(得分:2)
如果你做了你提出的建议,向foo.prototype添加一个方法会为bar.prototype添加一个方法 - 这就是你想要的。但是,向bar.prototype添加方法也会将该方法添加到foo.prototype-这不是您想要的。向子项添加方法不应影响父项的可用方法。
这样做的原因是bar.prototype和foo.prototype实际上是指同一个对象。并不是你已经创建了一个基于bar.prototype的副本,这正是你想要的。
你看到数组的相同之处就是你经常会看到这样的代码:
var newArray = oldArray.slice()
如果没有那个切片,更改newArray也会改变oldArray。与您给出的示例一样,这些变量都指向内存中的相同数组。