JavaScript原型-请澄清

JavaScript原型-请澄清,javascript,inheritance,prototype,Javascript,Inheritance,Prototype,有人能帮我了解一下原型酒店吗?我不明白prototype属性是函数的属性还是函数内部的属性 假设我们创建了以下构造器,Food。此时,函数Food()的属性为Food.prototype。因为Food是Object的实例,所以这意味着Obect.prototype是使用Food()创建的所有对象的prototype属性 然后创建另一个构造函数。Pizza具有Pizza.prototype属性 function Pizza(toppings) { this.toppings = toppi

有人能帮我了解一下原型酒店吗?我不明白prototype属性是函数的属性还是函数内部的属性

假设我们创建了以下构造器,Food。此时,函数Food()的属性为Food.prototype。因为Food是Object的实例,所以这意味着Obect.prototype是使用Food()创建的所有对象的prototype属性

然后创建另一个构造函数。Pizza具有Pizza.prototype属性

function Pizza(toppings) {
    this.toppings = toppings;
}
然后,通过将Pizza的prototype属性设置为Food的实例,使Pizza从Food继承。比萨饼的原型属性现在是Food.prototype,因为Food是比萨饼的父对象

Pizza.prototype = new Food();
然后我们创建一个Pizza实例

var myPizza = new Pizza("pepperoni");
myPizza是否也有从Pizza继承的原型属性?如果是,myPizza.prototype==Object.prototype吗?什么是Obejct.prototype?它是Object()的属性吗?是否只有函数具有prototype属性?Object.prototype是对象吗?Pizza.prototype是否引用了创建Pizza构造函数的整个函数?这个函数本身是一个对象吗

function Pizza(toppings) {
    this.toppings = toppings;
}
还是Pizza.prototype只是指Pizza()范围内的内容

比萨.配料是比萨.原型的财产吗?但是Pizza.prototype不是Pizza()的属性吗?toppings是否只是使用Pizza构造函数创建的对象的属性?Pizza.prototype是Pizza构造函数的属性吗

目前的原型链如下所示:


myPizza-->Pizza.prototype-->Food.prototype-->Object.prototype

我将从原型和构造器的工作方式开始,而不是从问题的答案开始,以避免在试图用部分理解来解释这些答案时出现混淆。因此,请回顾一下:

  • JavaScript中的每个值,除了
    null
    undefined
    ,都有一个关联的值:它的prototype

  • 原型用于查找属性。在计算
    x.foo
    时,检查值
    x
    是否有自己的属性,即自身的属性,名为“foo”。如果是,则
    x.foo
    是该属性的值。如果没有,则在
    x
    的原型上继续查找

  • 值的原型可以是
    null
    ,这意味着任何未找到自己属性的属性查找都会导致
    未定义

  • 您可以使用该函数获取值的原型

  • 可以使用函数创建具有特定原型的新对象

JavaScript中的构造函数有一个名为“prototype”的属性。此属性的值不是构造函数的原型;它是用构造函数创建的值的原型。以您的构造函数为例:

function Food() {}
如果运行
new Food()
,将创建一个新对象,其原型设置为
Food.prototype
,并将
this
设置为该新对象执行
Food
。换言之,这:

// create a new instance of Food
let f = new Food();
意思与此相同:

// create a new object with Food.prototype as its prototype
let f = Object.create(Food.prototype);

// initialize it using the constructor
Food.call(f);
现在,上面总结的属性查找工作方式产生了一个原型链。如果
x
有一个原型
y
y
没有原型,
x.foo
将在此链上查找:

x -> y -> null
  • 如果
    x
    有自己的属性“foo”,则
    x.foo
    将计算为其值
  • 如果
    y
    有自己的属性“foo”,则
    x.foo
    将计算为其值
  • 我们已经到达链的末端
    null
    ,因此
    x.foo
    未定义的
  • 构造函数的
    prototype
    属性的默认值是一个新的
    对象
    实例,因此
    newfood()
    的原型链如下所示:

    f -> Food.prototype -> Object.prototype -> null
    
    如果
    x
    的原型是
    C,那么可以说值
    x
    是构造函数
    C
    的一个实例。(如果
    x
    C.prototype
    x
    不是
    C
    的实例)这就是
    实例操作符的工作方式:

    console.log({}instanceof Object);//真的
    console.log(Object.prototype instanceof Object);//错误
    x -> y -> null
    
    f -> Food.prototype -> Object.prototype -> null