JavaScript原型 - 请澄清
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript原型 - 请澄清相关的知识,希望对你有一定的参考价值。
有人可以帮我理解原型属性吗?我不明白prototype属性是函数的属性还是函数内部的属性。
假设我们创建了以下构造函数Food。此时,函数Food()具有属性Food.prototype。由于Food是Object的一个实例,因此这意味着Obect.prototype是使用Food()创建的所有对象的prototype属性。
function Food() {}
然后创建另一个构造函数Pizza。 Pizza有Pizza.prototype属性。
function Pizza(toppings) {
this.toppings = toppings;
}
然后我们通过将Pizza的原型属性设置为Food的实例来使Pizza继承自Food。 Pizza的原型属性现在是Food.prototype,因为Food是披萨的父母。
Pizza.prototype = new Food();
然后我们创建一个Pizza实例
var myPizza = new Pizza("pepperoni");
myPizza还有一个继承自Pizza的原型属性吗?如果是这样,myPizza.prototype == Object.prototype?什么是Obejct.prototype?它是Object()的属性吗?只有函数有原型属性吗? Object.prototype是一个对象吗? Pizza.prototype是否指的是创建Pizza构造函数的整个函数?这个函数本身就是一个对象吗?
function Pizza(toppings) {
this.toppings = toppings;
}
或者Pizza.prototype只是引用Pizza()范围内的内容?
this.toppings = toppings;
Pizza.toppings是Pizza.prototype的属性吗?但是Pizza.prototype不是Pizza()的属性吗?浇头只是使用Pizza构造函数创建的对象的属性吗?而Pizza.prototype是Pizza构造函数的属性?
目前的原型链如下:
myPizza - > Pizza.prototype - > Food.prototype - > Object.prototype
我不是从问题的答案开始,而是从原型和构造函数的工作方式开始,以避免在尝试用部分理解来解释这些答案时产生混淆。那么,原型回顾:
- javascript中的每个值,除了
null
和undefined
,都有一个相关的值:它的原型.¹ - 原型用于查找属性。当你评估
x.foo
时,你会检查值x
是否有自己的属性 - 一个属于它自己的属性 - 名为“foo”。如果是这样,x.foo
就是那个属性的价值。如果没有,查找继续在x
的原型。 - 值的原型可以是
null
,这意味着任何找不到自己的属性的属性查找都会导致undefined
。 - 您可以使用
Object.getPrototypeOf
函数获取值的原型。 - 您可以使用功能
Object.create
创建具有特定原型的新对象。
JavaScript中的构造函数具有名为“prototype”的属性。此属性的值不是构造函数的原型;它是使用构造函数创建的值的原型。以您的示例构造函数为例:
function Food() {}
如果运行new Food()
,将创建一个新对象,其原型设置为Food.prototype
,Food
将在this
设置为该新对象的情况下执行。换句话说,这个:
// 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
是undefined
构造函数的prototype
属性的默认值是一个新的Object
实例,因此new Food()
的原型链如下所示:
f -> Food.prototype -> Object.prototype -> null
并且您可以说值x
是构造函数C
的一个实例,如果x
的原型是C.prototype
或x
的原型不是null并且是C
的实例。 (如果x
是C.prototype
,x
不是C
的一个例子。)这就是instanceof
算子的工作方式²:
console.log({} instanceof Object); // true
console.log(Object.prototype instanceof Object); // false
以上是关于JavaScript原型 - 请澄清的主要内容,如果未能解决你的问题,请参考以下文章