带你彻底领略JavaScript中的原型工具(2)

<script type="text/javascript"> function Person () { } alert(Person.prototype.constructor === Person); // true var p1 = new Person(); //利用instanceof 操纵符可以判定一个工具的范例。 //typeof一般用来获取简朴范例和函数。而引用范例一般利用instanceof,因为引用范例用typeof 老是返回object。 alert(p1 instanceof Person); // true </script>

我们按照需要,可以Person.prototype 属性指定新的工具,来作为Person的原型工具。

可是这个时候有个问题,新的工具的constructor属性则不再指向Person结构函数了。

看下面的代码:

<script type="text/javascript"> function Person () { } //直接给Person的原型指定工具字面量。则这个工具的constructor属性不再指向Person函数 Person.prototype = { name:"志玲", age:20 }; var p1 = new Person(); alert(p1.name); // 志玲 alert(p1 instanceof Person); // true alert(Person.prototype.constructor === Person); //false //假如constructor对你很重要,你应该在Person.prototype中添加一行这样的代码: /* Person.prototype = { constructor : Person //让constructor从头指向Person函数 } */ </script>

2.3 __proto__ 属性(留意:阁下各是2个下划线)

​ 用结构要领建设一个新的工具之后,这个工具中默认会有一个不行会见的属性 [[prototype]] , 这个属性就指向告终构要领的原型工具。

​ 可是在个体欣赏器中,也提供了对这个属性[[prototype]]的会见(chrome欣赏器和火狐欣赏器。ie欣赏器不支持)。会见方法:p1.__proto__

​ 可是开拓者只管不要用这种方法去会见,因为操纵不慎会改变这个工具的担任原型链。

<script type="text/javascript"> function Person () { } //直接给Person的原型指定工具字面量。则这个工具的constructor属性不再指向Person函数 Person.prototype = { constructor : Person, name:"志玲", age:20 }; var p1 = new Person(); alert(p1.__proto__ === Person.prototype); //true </script>

2.4 hasOwnProperty() 要领

​ 各人知道,我们用去会见一个工具的属性的时候,这个属性既有大概来自工具自己,也有大概来自这个工具的[[prototype]]属性指向的原型。

​ 那么如何判定这个工具的来历呢?

​ hasOwnProperty要领,可以判定一个属性是否来自工具自己。

<script type="text/javascript"> function Person () { } Person.prototype.name = "志玲"; var p1 = new Person(); p1.sex = "女"; //sex属性是直接在p1属性中添加,所以是true alert("sex属性是工具自己的:" + p1.hasOwnProperty("sex")); // name属性是在原型中添加的,所以是false alert("name属性是工具自己的:" + p1.hasOwnProperty("name")); // age 属性不存在,所以也是false alert("age属性是存在于工具自己:" + p1.hasOwnProperty("age")); </script>

所以,通过hasOwnProperty这个要领可以判定一个工具是否在工具自己添加的,可是不能判定是否存在于原型中,因为有大概这个属性不存在。

也等于说,在原型中的属性和不存在的属性城市返回fasle。

如何判定一个属性是否存在于原型中呢?

2.5 in 操纵符

​ in操纵符用来判定一个属性是否存在于这个工具中。可是在查找这个属性时候,此刻工具自己中找,假如工具找不到再去原型中找。换句话说,只要工具和原型中有一个处所存在这个属性,就返回true

<script type="text/javascript"> function Person () { } Person.prototype.name = "志玲"; var p1 = new Person(); p1.sex = "女"; alert("sex" in p1); // 工具自己添加的,所以true alert("name" in p1); //原型中存在,所以true alert("age" in p1); //工具和原型中都不存在,所以false </script>

回到前面的问题,假如判定一个属性是否存在于原型中:

假如一个属性存在,可是没有在工具自己中,则必然存在于原型中。

<script type="text/javascript"> function Person () { } Person.prototype.name = "志玲"; var p1 = new Person(); p1.sex = "女"; //界说一个函数去判定原型地址的位置 function propertyLocation(obj, prop){ if(!(prop in obj)){ alert(prop + "属性不存在"); }else if(obj.hasOwnProperty(prop)){ alert(prop + "属性存在于工具中"); }else { alert(prop + "工具存在于原型中"); } } propertyLocation(p1, "age"); propertyLocation(p1, "name"); propertyLocation(p1, "sex"); </script

三、组合原型模子和结构函数模子建设工具 3.1 原型模子建设工具的缺陷

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsjfxw.html