Javascript 如何将prototype附加到JS中的对象文本

Javascript 如何将prototype附加到JS中的对象文本,javascript,prototype,Javascript,Prototype,我试图理解JavaScripts原型的本质,并试图在不使用类构造函数的情况下创建对象继承 如果它们都是三个对象文字,我如何将原型链从动物连接到猫和狗 此外,还有一种方法可以创建和添加更多文字形式的属性(如myCat) 我已经在下面添加了代码&粘贴到bin 编辑:完全忽略对象。创建@jMerliN的答案更合适,除非您需要更广泛的向后兼容性 动物,猫和狗确实共享对象。原型,因为它们是对象的实例,但你不想把方法放在那里 您可以使用extend函数模拟继承: var Dog = { bark

我试图理解JavaScripts原型的本质,并试图在不使用类构造函数的情况下创建对象继承

如果它们都是三个对象文字,我如何将原型链从动物连接到猫和狗

此外,还有一种方法可以创建和添加更多文字形式的属性(如myCat)

我已经在下面添加了代码&粘贴到bin


编辑:完全忽略对象。创建@jMerliN的答案更合适,除非您需要更广泛的向后兼容性


动物
确实共享
对象。原型
,因为它们是
对象
的实例,但你不想把方法放在那里

您可以使用
extend
函数模拟继承:

var Dog = {
    bark : function() {
        console.log("Woof! My name is ")
    }
}

jQuery.extend(Dog, Animal)
这可能是下划线的
\uu.extend
,也可能是您自己的extend函数,它只是复制其属性:

function extend(obj, source){
    for (var prop in source) {
        obj[prop] = source[prop]
    }
} 
但要注意引用:字符串、数字、布尔值等“基本”值将被复制,而对象、函数和数组将被引用:


没有理由这样做,它容易出错,内存效率也较低;只需使用构造函数:)

您可以使用
对象。创建
将定义的对象用作原型。例如:

var Dog = Object.create(Animal, {
    bark : {
        value: function() {
            console.log("Woof! My name is " + this.name);
        }
    }
});
现在,您可以创建新的Dog对象:

var myDog = Object.create(Dog);
myDog.bark();  // 'Woof! My name is null'
myDog.getColor();  // 'The hair color is null'
例如:

或者,如果您在没有
Object.create
的情况下工作,则可以使用构造函数:

function Animal() {
    this.name = null;
    this.hairColor = null;
    this.legs = 4;
};

Animal.prototype = {
    getName : function() {
        return this.name;
    },
    getColor : function() {
        console.log("The hair color is " + this.hairColor);
    }
}

function Dog() {
}

Dog.prototype = new Animal;
Dog.prototype.bark = function() {
    console.log("Woof! My name is " + this.name);
};
例如:

有关Object.create的详细信息,请执行以下操作:

有关构造函数和原型链的更多信息:


除非通过非标准的
\uuuuu proto\uuuu
属性,否则无法更改现有对象的原型。我在OP上没有看到jQuery标记,使用如此大的库似乎也不合适,特别是当OP试图理解javascript(即ECMAScript)时。另外,扩展函数也会检查自己的属性。
Object.create
sets[[Prototype]]也一样:不仅仅是构造函数做了这项工作。@RobG拜托,我说了一个扩展函数,提到了下划线,并给出了实现代码(下划线,它不做自己的检查)。不需要jQuery仇恨。@RicardoTomasi将对象属性从一个对象复制到另一个对象不是继承,期望OP遵循jQuery扩展代码要求太多(特别是当它包含像isPlainObject这样的方法时)。这很有趣。。。只是出于好奇,这就是coffeescript在这里做的:哇,谢谢!这正是我想要的:)我没有意识到这是ES5内置的。。。很酷!!
var myDog = Object.create(Dog);
myDog.bark();  // 'Woof! My name is null'
myDog.getColor();  // 'The hair color is null'
function Animal() {
    this.name = null;
    this.hairColor = null;
    this.legs = 4;
};

Animal.prototype = {
    getName : function() {
        return this.name;
    },
    getColor : function() {
        console.log("The hair color is " + this.hairColor);
    }
}

function Dog() {
}

Dog.prototype = new Animal;
Dog.prototype.bark = function() {
    console.log("Woof! My name is " + this.name);
};