为什么原型考虑对象但不考虑功能

时间:2018-06-05 03:29:13

标签: javascript prototype

MDN开始,prototype属于Object的属性,但prototype更像是property function {1}}而不是?

鉴于以下代码,它正在点击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.');
}

我的问题更多的是试图理解为什么说原型是考虑对象属性的士气或原因,尽管可以说所有函数都是对象

1 个答案:

答案 0 :(得分:2)

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()。它允许您在对象创建时指定原型对象,如:

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

编辑: 但是默认情况下,所有函数都有一个“原型”成员对象,因为我们不知道该函数是否用作构造函数。使用Object.create()创建的对象文字或对象将不具有它。

console.log(cat.prototype); //undefined

至于将原型成员对象添加到对象文字中,堆栈溢出问题:Adding a prototype to an object literal