Javascript 原型继承新手-找不到未定义变量的问题

Javascript 原型继承新手-找不到未定义变量的问题,javascript,Javascript,我对JavaScript中的原型继承非常陌生,我试图理解这里的问题是什么 简单的代码,我们有两个对象pet和pet2,pet2继承自pet var Pet = function() { this.type="Dog"; this.age = 4; }; var Pet2 = function() { this.breed = "Kashon"; }; pet = new Pet(); pet2 = new Pet2(); if (Object.create !==

我对JavaScript中的原型继承非常陌生,我试图理解这里的问题是什么

简单的代码,我们有两个对象pet和pet2,pet2继承自pet

var Pet = function() {
    this.type="Dog";
    this.age = 4;
};

var Pet2 = function() {
    this.breed = "Kashon";
};

pet = new Pet();
pet2 = new Pet2();


if (Object.create !==  'function') {
    Object.create = function(oldObject) {
        function F() {}
        F.prototype = oldObject;
        return new F();
    };    
}

pet2 = Object.create(pet);
问题是,当我尝试访问pet2.breed时,由于某种原因,它是未定义的,为什么

alert(pet2.type); //ok
alert(pet2.age);  //ok
alert(pet2.breed); //comes out undefined?

任何帮助都很好:这里有很多问题

你把伪经典和原型遗传混为一谈。并不是说这不可能,但我只会坚持其中一个。由于您询问的是原型,所以除了在Object.create函数中之外,您应该远离new 您设置了两次pet2,因此覆盖了使其成为pet2实例的初始赋值。 你从来没有说过Pet2是从Pet1继承来的 下面是原型示例的样子:


这里有很多问题

你把伪经典和原型遗传混为一谈。并不是说这不可能,但我只会坚持其中一个。由于您询问的是原型,所以除了在Object.create函数中之外,您应该远离new 您设置了两次pet2,因此覆盖了使其成为pet2实例的初始赋值。 你从来没有说过Pet2是从Pet1继承来的 下面是原型示例的样子:


当您使用use Object.create时,您将旧对象指定为原型,例如Pet。当然,不会有Pet2的性质。您应该使用原型继承对象,如:Pet2.prototype=newpet


当您使用use Object.create时,您将旧对象指定为原型,例如Pet。当然,不会有Pet2的性质。您应该使用原型继承对象,如:Pet2.prototype=newpet


我还打算在我的回答中发布这个,因为这是对OP代码的最小更改。我没有,因为你会混合伪经典和原型遗传。Object.create应该避免使用SubClass.prototype=new SuperClass设置原型链的需要,或者至少在Object.create的实现中隐藏它。。。事实上,我只是注意到它甚至没有使用Object.create,这是OP问题的重点,不是吗?我不知道它在哪里混合了伪经典和原型继承?在我的回答中,只有纯原型,不是吗?是的,我注意到它之后,所以我的评论之后。。。应该解释一下。我假设您最终会使用Object.create来创建一个继承自Pet2的对象,但是,您只是使用new,这是所有Object.create纯粹主义对象的目标。我特别认为这个伪经典是最好的方法给我构造函数,我只是不认为它回答了这个问题,尽管它解决了这个问题。。。对不起,听了我的解释,连我的头都晕了。你说得对。在我的例子中,我只是对Object.create不够熟悉,我从它不存在的时候开始,然后变成了带有内置的经典继承方案的MooTools,我现在主要使用它。所以,谢谢你的宝贵意见,朋友。顺便说一下,通过SubClass.prototype=new SuperClass设置继承有一个问题。如果你好奇的话,看看我的帖子。我也打算在我的答案中发布这个,因为这是对OP代码的最小更改。我没有,因为你会混合伪经典和原型遗传。Object.create应该避免使用SubClass.prototype=new SuperClass设置原型链的需要,或者至少在Object.create的实现中隐藏它。。。事实上,我只是注意到它甚至没有使用Object.create,这是OP问题的重点,不是吗?我不知道它在哪里混合了伪经典和原型继承?在我的回答中,只有纯原型,不是吗?是的,我注意到它之后,所以我的评论之后。。。应该解释一下。我假设您最终会使用Object.create来创建一个继承自Pet2的对象,但是,您只是使用new,这是所有Object.create纯粹主义对象的目标。我特别认为这个伪经典是最好的方法给我构造函数,我只是不认为它回答了这个问题,尽管它解决了这个问题。。。对不起,听了我的解释,连我的头都晕了。你说得对。在我的例子中,我只是对Object.create不够熟悉,我从它不存在的时候开始,然后变成了带有内置的经典继承方案的MooTools,我现在主要使用它。所以,谢谢你的宝贵意见,朋友。顺便说一下,通过SubClass.prototype=new SuperClass设置继承有一个问题。如果您感到好奇,请查看我的帖子,因为new根本没有被使用,这是否意味着我不应该使用构造函数,而应该在继承时使用对象文本?我很抱歉,如果这些问题都是愚蠢的,还是新鲜的:如果你喜欢这种风格,是的。但是我
fer使用new,object.create对于对象初始化来说不是那么直观,因为根本没有使用new,这是否意味着在继承时不应该使用构造函数而只使用对象文本?我很抱歉,如果这些问题都是愚蠢的,还是新鲜的:如果你喜欢这种风格,是的。但我更喜欢使用新的object.create,因为它对对象初始化没有那么直观
var Pet1 = {
  type: "Dog",
  age: 4
};

// Make Pet2 inherit from Pet1
var Pet2 = Object.create(Pet1);
// Add new properties to Pet2, this can and should be done 
// by passing another argument to Object.create , but any 
// hacked version can't support it
Pet2.breed = "Kashon";

// Now create an object that inherits from Pet2 (and consequently, Pet1)
var pet = Object.create(Pet2);

alert(pet.type); //ok
alert(pet.age);  //ok
alert(pet.breed); //ok
var Pet = function() {
  this.type="Dog";
  this.age = 4;
};

var Pet2 = function() {
  this.breed = "Kashon";
};
Pet2.prototype = new Pet; // Pet2 inherits Pet

pet = new Pet();
pet2 = new Pet2();

alert(pet2.type); //ok
alert(pet2.age);  //ok
alert(pet2.breed); // ok?