Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我的JavaScript对象属性会被其他实例覆盖?_Javascript_Oop_Inheritance - Fatal编程技术网

为什么我的JavaScript对象属性会被其他实例覆盖?

为什么我的JavaScript对象属性会被其他实例覆盖?,javascript,oop,inheritance,Javascript,Oop,Inheritance,我创建了一个如下所示的对象 var BaseObject = function(){ var base = this; base.prop; base.setProp = function(val){ base.prop = val; } } var a = new BaseObject(); var b = new BaseObject(); a.setProp("foo"); b.setProp("bar"); console.log(a.prop);

我创建了一个如下所示的对象

var BaseObject = function(){

var base = this;
base.prop;

base.setProp = function(val){
    base.prop = val;
}
}
var a = new BaseObject();
var b = new BaseObject();           

a.setProp("foo");
b.setProp("bar");

console.log(a.prop); // outputs 'foo'
console.log(b.prop); // outputs 'bar'
当我调用
setProp
方法时,我得到以下结果

var BaseObject = function(){

var base = this;
base.prop;

base.setProp = function(val){
    base.prop = val;
}
}
var a = new BaseObject();
var b = new BaseObject();           

a.setProp("foo");
b.setProp("bar");

console.log(a.prop); // outputs 'foo'
console.log(b.prop); // outputs 'bar'
然后我创建了另一个从
BaseObject
继承的对象,如下所示

var TestObject = function(){
    // do something
}

TestObject.prototype = new BaseObject();
当我做同样的事情时,我得到了一个出乎意料的结果

var a = new TestObject();
var b = new TestObject();

a.setProp("foo");
b.setProp("bar");

console.log(a.prop); // outputs 'bar'
console.log(b.prop); // outputs 'bar'

我不知道为什么。最近我读了很多关于闭包和原型继承的书,我怀疑我把它们都弄糊涂了。因此,任何关于这个特定示例为何如此工作的指针都将非常感谢

将protoypal继承看作是只处理对象,而没有类的概念。在代码中有一个
BaseObject
对象,该对象具有
prop
属性。您还有两个从该对象的一个实例延伸而来的其他对象,但该特性属于原始对象。如果您需要每个对象都有自己的副本,那么需要为它们指定一个为该对象初始化的不同变量(例如在其构造函数中)


另一方面,Java风格的访问器在JavaScript中使用过度(如果需要,您可以在本机上拦截访问),并且会进一步混淆这些问题,因为它们的行为不同。

只有一个
BaseObject
实例,所有
TestObject
都从中继承。不要使用实例来创建原型链

你想要的是:

var TestObject = function(){
    BaseObject.call(this); // give this instance own properties from BaseObject
    // do something
}
TestObject.prototype = Object.create(BaseObject.prototype);

有关
new
问题的详细说明,请参阅和。还可以看看

只有一个原型实例,所以“TestObject”的所有实例都共享它。也就是说,只有一个“基”。所以每次创建实例时,我都需要设置原型?@gargantaun:如果希望
prop
正常工作,请将其放入
BaseObject.prototype
中。i、 e.:
BaseObject.prototype.prop
所以TestObject需要有自己的
prop
属性。从TestObject继承的任何东西也需要它自己的
prop
属性?诸如此类?是的,就像经典继承一样,但您必须以不同的方式实现它,确保以正确的方式调用构造函数,或者使用mixin,以便所有实例数据都位于它所属的位置。