在JavaScript中继承时实例化函数有什么意义?

时间:2014-01-19 00:47:32

标签: javascript

我一直认为从其他函数继承原型时,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} 

http://jsfiddle.net/VWDjU/

1 个答案:

答案 0 :(得分:2)

如果你做了你提出的建议,向foo.prototype添加一个方法会为bar.prototype添加一个方法 - 这就是你想要的。但是,向bar.prototype添加方法也会将该方法添加到foo.prototype-这不是您想要的。向子项添加方法不应影响父项的可用方法。

这样做的原因是bar.prototype和foo.prototype实际上是指同一个对象。并不是你已经创建了一个基于bar.prototype的副本,这正是你想要的。

你看到数组的相同之处就是你经常会看到这样的代码:

var newArray = oldArray.slice()

如果没有那个切片,更改newArray也会改变oldArray。与您给出的示例一样,这些变量都指向内存中的相同数组。