首页 > 解决方案 > 为什么原型考虑对象而不考虑函数

问题描述

从这个MDN中,它看起来prototype是 的一个属性Object,但它看起来更像prototype是一个propertyfunction而不是?

鉴于下面的代码,它正在命中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.');
}

我的问题更多是试图理解为什么说原型被认为是对象的属性背后的士气或原因,尽管有人可以争辩说所有函数都是对象

标签: javascriptprototype

解决方案


原型是对象属性,函数第一类对象。

要在实例化期间使对象可参数化,我们可以通过构造函数创建一个对象,如您所写:

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

至于将原型成员对象添加到对象字面量,堆栈溢出问题:将原型添加到对象字面量


推荐阅读