从这里MDN , 它使 prototype
看起来是 Object
的一个属性,但看起来更像是 prototype
是一个 property
函数
代替?
鉴于下面的代码,它正在命中 TypeReference
let Animal = {
name: 'randomAnimal'
}
Animal.prototype.speak = function () {
console.log(this.name + ' makes a noise.');
}
为了让它工作,而不是对象,我们将它改为函数,如下所示
function Animal (name) {
this.name = name;
}
Animal.prototype.speak = function () {
console.log(this.name + ' makes a noise.');
}
我的问题更多是试图理解为什么说原型(prototype)被认为是对象的属性背后的士气或原因,尽管可以争辩说所有函数都是对象
最佳答案
原型(prototype)是对象属性,函数是第一类对象。
要在实例化期间使对象可参数化,我们可以通过构造函数创建对象,如您所写:
function Animal (name) {
this.name = name;
}
Animal.prototype.speak = function() {
console.log(this.name + " says hi!");
}
var lion = new Animal("lion");
lion.speak(); // "lion says hi!"
这里在对象构造时给出了一个名称。
但是你也可以使用对象初始化器来创建对象,比如
let lion = {
name: "lion",
speak: function() {
console.log(this.name + " says hi!");
}
}
lion.speak(); // "lion says hi!"
当然,使用构造函数会更容易,尤其是当您有多个属性要初始化和/或要构造多个类似对象时。
创建对象的第三种方法是使用 Object.create()。它允许您在创建对象时指定原型(prototype)对象,例如:
var cat = Object.create(lion);
cat.name = "house cat";
cat.speak(); // "house cat says hi!"
console.log(lion.isPrototypeOf(cat)); // true
有关 JavaScript 中对象的信息,请参阅 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects
编辑: 但默认情况下,所有函数都有一个“原型(prototype)”成员对象,因为我们不知道该函数是否要用作构造函数。对象文字或使用 Object.create() 创建的对象不会有它。
console.log(cat.prototype); //undefined
关于将原型(prototype)成员对象添加到对象字面量,堆栈溢出问题:Adding a prototype to an object literal
关于javascript - 为什么原型(prototype)考虑对象而不是函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50691570/