对于以下函数,我期望a和b有自己的数组版本,因此期望输出为false,但它打印为true。任何人都可以解释一下,为什么?
function Test() {
var a = [1,2,3];
Test.prototype.getArray = function() { return a; };
}
var a = new Test();
var b = new Test();
console.log(a.getArray() === b.getArray());
答案 0 :(得分:2)
每个Test
对象都继承相同的原型。 完全相同的原型。由于您正在覆盖原型函数,因此它会覆盖该类型的所有对象。
示例:
function log(msg) {
document.querySelector('pre').innerText += msg + '\n';
}
function Person(name) {
this.name = name;
}
Person.prototype.sayHello = function() {
log('Hello, ' + this.name);
};
var bob = new Person('Bob');
var alice = new Person('Alice');
bob.sayHello();
alice.sayHello();
// Overwriting the prototype function
Person.prototype.sayHello = function() {
log('Goodbye, ' + this.name);
};
bob.sayHello();
alice.sayHello();

<pre></pre>
&#13;
如果您绝对需要使用标准构造函数访问函数中的私有数据,则需要在构造函数本身中定义函数。
function Test() {
var a = [1,2,3];
this.getArray = function() {
return a;
};
}
请注意,这会消除许多实现中从原型继承中获得的大量空间和性能优化。