5、通过in属性检查测验某些对象在原型大概本人中是或不是含有有某些属性

alert(p1.constructor == Person); //false

4、通过delete删除本身空间中的属性

数据解读[JavaScript学习]JavaScript面向对象-原型的重写-Web前端之家。原型重写之后,JavaScript会为原型分配一块新的内部存款和储蓄器,Person类指向新的原型对象,而原本创立的p1对象的_proto_天性依旧指向前边的原型对象。

6、自定义方法检查测量试验某些属性是还是不是在原型中留存

重写原型

在上一篇文章中大家介绍了”JavaScript面向对象-简单对象的创始和JSON对象”。明日将世襲求学其余知识:JavaScript面向对象-原型的重写。上边大家将第一要介绍一些常用的原型和对象属性的检查实验方法。大家还是以上一篇随笔的Person类为例子,创制Person类的代码如下:

function hasPrototypeProperty{ return(!obj.hasOwnProperty && ;}
delete p2.name;p2.say();alert(p2.hasOwnProperty; //false

在行使方面包车型地铁法子对原型进行重写之后,由于原型重写了,况且从不经过Person.prototype来指定,此时的constructor不会再指向Person,而是指向了Object

再接下去大家对Person原型举办了重写,在原型中增添了一部分性质和方式。

alert(p1.constructor == Person); //true

随后大家创设了p1对象,然后在Person的原型中增加了一个sayHi()方法。此时Person原型的内部存款和储蓄器模型如下图所示:

对象p1在和煦的半空中中绝非name质量,所以回来false数据解读 ,。而对象p2重新为name属性实行了赋值,在它的半空中中设有name属性,所以回来true

alert("name" in p1); //在原型中有,所以为truealert("name" in p2); //在自己的空间中有,所以为true
function Person(){};Person.prototype.name = "Leon";Person.prototype.age = 22;Person.prototype.say = fucntion(){ alert(this.name + "," + this.age);}var p1 = new Person();var p2 = new Person();p2.name = "Ada";p1.say;

新创造的p2对象的_proto_品质指向的是重写后的原型对象,假如当时实施p2.sayHi()方法,那么在p2对象和它所指向的原型上都未有sayHi()措施,所以程序会报错。

2、检查实验某些对象的constructor

该措施能够检查实验p1的原型是或不是是Person

那儿的原型内部存款和储蓄器模型如下图所示:

alert(p1.hasOwnProperty; //falsealert(p2.hasOwnProperty; //true

回来javascript教程主目录>>

在上头的代码中,大家第一成立了八个Person类,此时Person原型的内部存款和储蓄器模型如下图所示:

假使我们像前面那么编写代码,会有大气的Person.prototype.xxx话语,那样不便利我们阅读和了然。我们得以经过相似Json格式来重写原型,代码如下:

如果constructor对此你的次第来讲实在相比首要,能够在json中宣称原型的针对性。

假如有个别属性在原型和团结的空中中都未有,取得的结果就是false

1、检查实验有个别对象是不是是某些函数的原型

透过上面包车型地铁原型内部存款和储蓄器模型的解析,大家得以领略原型重写地点会直接影响对象的性质和艺术,在重写前创办的靶子和在重写后成立的对象具备的性格和办法是分裂的。上面的几张内部存款和储蓄器模型图一定要时刻谨记在脑海中。

var p1 = new Person();//在Person的原型上添加了sayHi()方法Person.prototype.sayHi = function(){ alert(this.name + "Hi!");}p1.sayHi(); //输出: undefined:hi!

注意现行反革命的内部存款和储蓄器模型,由于在此种景况中,在p1对象自身的空7月Person原型中都从未有过name天性,所以实行p1.sayHi()主意的时候,this.name属性为undefined,最后的输出结果为undefined:hi!

在对原型实行重写的时候,大家恐怕会遇见下边包车型地铁一些主题素材。上面我们先来看一段会现身难题的原型重写的代码,然后再对代码中每三个等第实行内部存款和储蓄器模型分析。代码如下:

Person.prototype = { constructor:Person, //手动指定constructor name:"Leon", age:22, say:function(){ alert(this.name+ "," + this.age); }}
var p2 = new Person;
//重写原型Person.prototype = { name:"Leon", age:22, say:function(){ alert(this.name+ "," + this.age); }}var p1 = new Person;

此刻的原型内部存款和储蓄器模型如下图所示:

3、检查实验有些属性是还是不是是自个儿的属性

笔者们得以选取delete来删除对象本人空间中的某些属性,如上边代码所示。

那时,假如大家在施行p1.sayHi(),程序不会报错,可是试行的结果一如将来是undefined:hi!,因为在p1对象和它所针对的原型中都从未name属性。

举例那时试行p1.say()办法,由于在p1和它指向的原型中都从没say()艺术,所以程序会报错。

// 对Person原型进行重写Person.prototype = { constructor:Person //手动指定constructor name:"Leon", age:22, say:function(){ alert(this.name+ "," + this.age); }}p1.sayHi(); //输出: undefined:hi!

终极,在原型重写之后,大家创设了指标p2。

上边代码中大家自定义了二个质量评定有个别属性是或不是在原型中设有的点子,可以如下使用那么些艺术:

alert(hasPrototypeProperty; //truealert(hasPrototypeProperty; //false

原型重写的主题材料

因为p1对象的name品质是存在于原型中的,所以回来true,而p2对象的name品质是在协调空间中的,所以回来false

// 创建Person类function Person(){}var p1 = new Person();//在Person的原型上添加了sayHi()方法Person.prototype.sayHi = function(){ alert(this.name + "Hi!");}p1.sayHi(); //输出: undefined:hi!// 对Person原型进行重写Person.prototype = { constructor:Person, //手动指定constructor name:"Leon", age:22, say:function(){ alert(this.name+ "," + this.age); }}var p2 = new Person;//正确p1.say();//报错
alert(Person.prototype.isPrototypeOf; //true

相关文章

网站地图xml地图