这是一个非常简单的基于原型的对象模型,在解释过程中将被视为示例,目前尚未发表评论:
职能人员(姓名){this.name=名称;}Person.prototype.getName=函数(){console.log(this.name);}var person=新人(“George”);
在讨论原型概念之前,我们必须考虑一些关键点。
1-JavaScript功能的实际工作方式:
为了迈出第一步,我们必须弄清楚JavaScript函数实际上是如何工作的,作为一个类函数,使用这
关键字,或者作为带有参数的常规函数,它做什么以及返回什么。
假设我们想创建一个人
对象模型。但在这一步我会努力不使用原型
和新的
关键字.
所以在这个步骤中功能
,物体
和这
关键字,是我们所有的。
第一个问题是怎样这
关键字可以不使用新的
关键字.
所以为了回答这个问题,假设我们有一个空对象和两个函数,比如:
var人={};函数Person(name){this.name=name;}函数getName(){console.log(this.name);}
现在不使用新的
关键字我们如何使用这些函数。因此JavaScript有三种不同的方法:
a.第一种方法是将函数作为常规函数调用:
人(“乔治”);获取名称()//会在控制台上打印“乔治”
在这种情况下,这将是当前上下文对象,它通常是全局的窗口
浏览器中的对象或全球的
在里面节点.js
。这意味着我们在浏览器中有window.name或在Node.js中有GLOBAL.name,其值为“George”。
b.我们可以贴上作为对象的属性
-最简单的方法为此,需要修改空人
对象,如:
人。人=人;person.getName=获取名称;
这样我们可以这样称呼他们:
人。人(“乔治”);person.getName();//-->“乔治”
现在人
对象类似于:
对象{Person:函数,getName:函数,name:“George”}
-附加属性的另一种方法对象使用原型
可以在任何名为的JavaScript对象中找到的对象__原型__
,我已经尝试在总结部分对其进行了解释。因此,我们可以通过以下操作获得类似的结果:
人__原型__。人=人;人__proto__.getName=获取名称;
但是这样我们实际上正在做的是修改对象.原型
,因为每当我们使用文本创建JavaScript对象时({ ... }
),它是基于对象.原型
,这意味着它将作为名为__原型__
,所以如果我们像在前面的代码片段中那样更改它,所有JavaScript对象都会更改,这不是一个好的实践。那么,现在有什么更好的做法呢
人__原型={人员:人员,获取名称:获取名称};
现在其他物体都安然无恙了,但这似乎并不是一个好习惯。所以我们还有一个解决方案,但要使用这个解决方案,我们应该回到代码行,其中人
已创建对象(var人={};
)然后将其更改为:
var属性对象={人员:人员,获取名称:获取名称};var person=Object.create(propertiesObject);
它所做的是创建一个新的JavaScript对象
并将属性对象
到__原型__
属性。因此,为了确保您可以:
console.log(person.__proto__===属性对象)//真的
但这里需要注意的是,您可以访问中定义的所有属性__原型__
在第一层人
对象(有关更多详细信息,请阅读摘要部分)。
正如您看到的,使用这两种方法中的任何一种这
正好指向人
对象。
c.JavaScript有另一种提供函数的方法这
,正在使用呼叫或应用调用函数。
apply()方法调用具有给定此值的函数,并且作为数组(或类似数组的对象)提供的参数。
和
call()方法使用给定的此值调用函数,并且单独提供的参数。
这种方法是我最喜欢的,我们可以很容易地调用我们的函数,例如:
个人电话(个人,“George”);
或
//当参数计数不固定时,apply更有用个人申请(个人,[“乔治”]);getName.call(个人);getName.apply(个人);
这三种方法是计算原型功能的重要初始步骤。
2-如何新的
关键词工作?
这是理解.原型
功能。这是我用来模拟流程的工具:
函数Person(name){this.name=name;}my_person_prototype={getName:function(){console.log(this.name);}};
在这一部分中,我将尝试采取JavaScript所采取的所有步骤,而不使用新的
关键字和原型
,当您使用新的
关键字。所以当我们这样做的时候新人(“乔治”)
,人
函数充当构造函数,JavaScript的功能如下:
a.首先,它生成一个空对象,基本上是一个空散列,如:
var newObject={};
b.JavaScript的下一步是贴上新创建对象的所有原型对象
我们有我的个人原型
这里类似于prototype对象。
for(my_person_prototype中的var键){newObject[key]=my_person_protype[key];}
JavaScript实际上并不是以这种方式附加原型中定义的属性。实际方式与原型链概念有关。
a.和b.不用这两个步骤,您可以通过执行以下操作获得完全相同的结果:
var newObject=Object.create(my_person_prototype);//在这里您可以查看proto_属性console.log(newObject.__proto__===my_person_prototype)//真的//并检查您是否可以访问所需的属性console.log(newObject.getName的类型)//“功能”
现在我们可以打电话给获取名称
在我们的我的个人原型
:
newObject.getName();
c.然后将该对象提供给构造函数,
我们可以用我们的样品这样做:
Person.call(newObject,“George”);
或
Person.apply(newObject,[“George”]);
那么构造函数可以做它想做的任何事情,因为这该构造函数的内部是刚刚创建的对象。
现在是模拟其他步骤之前的最终结果:对象{name:“George”}
总结:
基本上,当您使用新的关键字,您正在调用该函数,该函数充当构造函数,因此当您说:
新建FunctionName()
JavaScript在内部生成一个对象,一个空散列,然后将该对象交给构造函数,然后构造函数可以做它想做的任何事情,因为这该构造函数的内部是刚刚创建的对象,当然,如果您没有在函数中使用return语句,或者如果您放置了返回未定义;
在函数体的末尾。
因此,当JavaScript在对象上查找属性时,它做的第一件事就是在该对象上查找它。还有一个秘密财产[[原型]]
我们通常都是这样的__原型__
JavaScript接下来会看到这个属性。当它看到__原型__
,就另一个JavaScript对象而言,它有自己的__原型__
属性,它会不断向上移动,直到到达下一个__原型__
为null。点是JavaScript中唯一的对象__原型__
属性为null为对象.原型
对象:
console.log(Object.prototype.__proto__===空)//真的
这就是JavaScript中继承的工作原理。
换言之,当你在一个函数上有一个原型属性并在其上调用一个new时,在JavaScript完成查看新创建的对象的属性后,它将查看函数的.原型
而且这个对象可能有自己的内部原型。等等。