对Javascript中原型和继承的深入理解
一般来说,Javascript中的对象是指向原型的指针和一个自己的属性列表。只有构造函数具有原型属性,而原型链继承是创建一个新指针,指向构造函数的原型属性。
Javascript属性的遍历机制特别决定了原型属性,本质上它是一个普通的指针。
构造函数包括:
1的对象。
2的功能。
3。阵列
4的日期。
5。字符串
让我们举一些例子。
复制代码代码如下所示:
每一个函数都有一个原型的默认属性,原型构造函数默认为这个函数。
注意,person.constructor不等于person.prototype.constructor。具有构造函数属性的函数实例
功能人(名称){
this.name =名称;
};
person.prototype.getname =函数(){
返回this.name;
};
var p =新的人(zhangsan);
console.log(person.prototype.constructor =人); / /真的
console.log(p.constructor =人); / /真的,这是因为P本身并不含有构造函数属性,所以这里实际上是所谓person.prototype.constructor
我们的目的是表达
1。表明人是从动物身上继承的
2。显示P2是一个人的例子。
我们修改了原型属性的方向,使人可以在动物原型属性中得到方法,即人继承动物(人是野生动物)。
复制代码代码如下所示:
功能人(名称){
this.name =名称;
};
person.prototype.getname =函数(){
返回this.name;
};
VaR P1 =新的人(zhangsan);
console.log(p.constructor =人); / /真的
console.log(person.prototype.constructor =人); / /真的
函数动物(){ }
person.prototype =新的(动物); / /不使用person.prototype = animal.prototype的原因,因为新的具有其他功能,最后。
VaR P2 =新的人(zhangsan);
/ /(P2 -> person.prototype -> animal.prototype,所以p2.constructor实际上是动物。原型。构造函数)
console.log(p2.constructor =人); / /输出是错误的,但我们的意思是这里的事实,表明P2是人的一个实例。在这一次的目标是达到1,与2的目标没有达到。
但是如果我们用这种方法修理它
person.prototype =新的动物();
person.prototype.constructor =人;
在这一点上,p2.consturctor是正确的,指向人,表明P2是人类的一个实例,但新的问题出现了。此时的目标是达到2,与1的目标没有达到。
目的1和目的2在这个时候是矛盾的,因为原型表达了这个矛盾的两个意思。
1显示父类是谁
2作为自己实例的原型复制
所以我们不能直接使用原型属性来表示人的父母,而是用getprototypeof()方法来知道谁是父类。
复制代码代码如下所示:
person.prototype =新的动物();
person.prototype.constructor =人;
VaR P2 =新的人(zhangsan);
p2.constructor功能(人){} / /显示
object.getprototypeof(人。原型)。构造函数(动物){} / /显示
这两个概念是分开的。
最后,结论如下:
当执行新的人()执行时,新做以下事情:
创建空白对象
创建一个指针person.prototype
该对象通过关键字进入构造函数并执行构造函数。
如果person.prototype = animal.prototype用来表明人是继承于动物,实例方法也表明P也是动物的一个实例。真正的原因。不使用是两个原因:
1.new创建新对象,从而避免了设置person.prototype.constructor =人也导致animal.prototype.constructor对人的价值,但动态到新创建的对象实例构造函数的属性,此实例构造函数属对animal.prototype.constructor盖,所以person.prototype.constructor和animal.prototype.contructor分手。
2个动物的属性不能被传递给人。
利用hasownproperty()方法,实例属性访问时,当原型性质是明确的。