javascript - 为什么原型(prototype)考虑对象而不是函数

标签 javascript prototype

从这里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/

相关文章:

javascript - 定义原型(prototype)属性的正确方法

Javascript原型(prototype)扩展方法

javascript - JS 中的原型(prototype)问题

javascript - 访问派生类中使用 Wea​​kMap 定义的私有(private)变量

php - 可以使用基于 PHP 的脚本代理通过 AJAX 请求的资源吗?

javascript - 在javascript中动态重新格式化输入以在数字中添加逗号

javascript - 如何在不使用 YUI 索引的情况下查看 javascript 数组?

javascript - 从基址调用原型(prototype)函数中声明的函数 "class": JavaScript prototyping

javascript - 检查对象是否具有用户定义的原型(prototype)?

javascript - 在 iframe 中运行 js 函数,IE7