JavaScript原型-请澄清
有人能帮我了解一下原型酒店吗?我不明白prototype属性是函数的属性还是函数内部的属性 假设我们创建了以下构造器,Food。此时,函数Food()的属性为Food.prototype。因为Food是Object的实例,所以这意味着Obect.prototype是使用Food()创建的所有对象的prototype属性 然后创建另一个构造函数。Pizza具有Pizza.prototype属性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
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
,都有一个关联的值:它的prototypeundefined
- 原型用于查找属性。在计算
时,检查值x.foo
是否有自己的属性,即自身的属性,名为“foo”。如果是,则x
是该属性的值。如果没有,则在x.foo
的原型上继续查找x
- 值的原型可以是
,这意味着任何未找到自己属性的属性查找都会导致null
未定义
- 您可以使用该函数获取值的原型
- 可以使用函数创建具有特定原型的新对象
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