javascript - 原型(prototype)继承中的奇怪行为

标签 javascript prototype

我对原型(prototype)继承的概念比较陌生,所以也许这就是原型(prototype)继承应该如何工作,或者这可能只是 javascript,但看起来原型(prototype)继承只是好的原始类型。例如我有以下代码:

var leg = {
    type: null
};

var Animal = {
  traits: {},
  leg: Object.create(leg)
};

var lion = Object.create(Animal);
lion.traits.legs = 4;
lion.leg.type = 'left';

var bird = Object.create(Animal);
bird.traits.legs = 2;
bird.leg.type = 'right';

alert(lion.traits.legs) // shows 2???
alert(lion.leg.type) // shows right???

最后两行显示了我的困惑。这真的是原型(prototype)继承应该如何工作的,还是 javascript 就是这样实现的?

如果这确实是原型(prototype)继承应该如何工作的,我真的不明白这种类型的继承在大多数情况下会有什么用处。如果我只能拥有原始类型,那么在创建复杂对象方面似乎非常有限,因为在很多情况下我有一个对象存储另一个对象的实例。

最佳答案

不要继承非原始状态。继承方法。让每个对象都有自己的状态。状态使对象变得独一无二,如果所有对象共享相同的状态,那就没有意义了。

var Animal = {
    method1: function() {},
    method2: function() {}
};

var lion = Object.create(Animal, {
    traits: {
        value: {}
    },
    leg: {
        value: {
            type: null
        }
    }
});

var bird = Object.create(Animal, {
    traits: {
        value: {}
    },
    leg: {
        value: {
            type: null
        }
    }
});

顺便说一句,有一种更简洁且支持更好的语法来完成几乎相同的事情:

function Animal(traits, leg) {
    this.traits = traits;
    this.leg = leg;
}

var method = Animal.prototype;

method.method1 = function() {

};

method.method2 = function() {

};


var lion = new Animal({}, {type: null}),
    bird = new Animal({}, {type: null});

关于javascript - 原型(prototype)继承中的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12108109/

相关文章:

javascript - 如何使用 Object.assign() 从其他对象引用基础对象属性

javascript - 在 Javascript 中向对象原型(prototype)添加许多函数时出现性能问题?

javascript - 从右到左输入掩码

javascript - OpenLayers 2 - 如何获取所选要素(点)的坐标

javascript - 如何使用 jquery + ajax 制作多个依赖下拉列表

javascript - 如何适应具有固定高度的DIV的内容

javascript - $$ 和 $ 之间的区别

javascript - 阵列拼接原型(prototype)

javascript - 尝试将一些 JavaScript 嵌入到 Laravel View 中的 foreach 循环中

javascript - 在 div 中查找任何类型的第一个可聚焦项目