说说js原型的个人理解

最近在温习JavaScript高级程序设计,大概看下来,理解的流程是这样的。

首先是想创建一个对象,怎么创建对象,花了很多心思。我觉得原型这个东西就是发明出来给懒人用的一个属性,想要创建对象的过程简单,还能将对象属性,只定义一次就能重复使用,什么工厂模式和构造函数模式都太麻烦,所以就有了原型这个东西。

既然这个原型这货这么好使,懒人就要进一步将懒惰发挥到极致,就让这东西,来实现继承了,就有原型链了,这下定义一次,就可以滥用了。

构造函数,原型对象,实例对象三者之间的关系

每创建一个函数,该函数都会自动带有一个prototype属性。该属性是一个指针,指向一个对象,该对象称之为原型对象(后期我们可以使用这个原型对象帮助我们在js中实现继承).

原型对象上默认有一个属性constructor,该属性也是一个指针,指向其相关联的构造函数。

通过调用构造函数产生的实例对象,都拥有一个内部属性,指向了原型对象。其实例对象能够访问原型对象上的所有属性和方法。

总结:三者的关系是,每个构造函数都有一个原型对象,原型对象上包含着一个指向构造函数的指针,而实例都包含着一个指向原型对象的内部指针。通俗的说,实例可以通过内部指针访问到原型对象,原型对象可以通过constructor找到构造函数。

让原型对象等于另一个类型的实例,显然,此时的 原型对象将包含一个指向另一个原型的指针,相应地,另一个原型中也包含着一个指向另一个构造函数 的指针。假如另一个原型又是另一个类型的实例,那么上述关系依然成立,如此层层递进,就构成了实 例与原型的链条。这就是所谓原型链的基本概念。

1)搜索实例;2)搜索 SubType.prototype; 3)搜索 SuperType.prototype,最后一步才会找到该方法。在找不到属性或方法的情况下,搜索过 程总是要一环一环地前行到原型链末端才会停下来。

原型链实现继承,存在一些问题。其中,最主要的问题来自包含引用类型值的原型。包含引用类型值的原型属性会被所有实例共享,而这也正是为什么要在构造函数中,而不是在原型对象中定义属性的原因。在通过原型来实现继承时,原型实际上会变成另一个类型的实例。于是,原先的实例属性也就顺理成章地变成了现在的原型属性了。 

扫描二维码关注公众号,回复: 3062946 查看本文章
function SuperType(){
        this.colors = ["red", "blue", "green"];
}
function SubType(){
}
//继承了 SuperType
SubType.prototype = new SuperType();
var instance1 = new SubType(); instance1.colors.push("black"); alert(instance1.colors); //"red,blue,green,black"
var instance2 = new SubType(); alert(instance2.colors); //"red,blue,green,black"

通过使用 apply()和 call()方法也可以在(将来)新创建的对象上执行构造函数。通过使用 call()方法(或 apply()方法 也可以),我们实际上是在(未来将要)新创建的 SubType 实例的环境下调用了 SuperType 构造函数。 这样一来,就会在新 SubType 对象上执行 SuperType()函数中定义的所有对象初始化代码。结果, SubType 的每个实例就都会具有自己的 colors 属性的副本了。

function SuperType(){
    this.colors = ["red", "blue", "green"];
}
 function SubType(){
//继承了 SuperType
    SuperType.call(this);
}
var instance1 = new SubType();
instance1.colors.push("black");
alert(instance1.colors);    //"red,blue,green,black"
var instance2 = new SubType();
alert(instance2.colors);    //"red,blue,green"

如果仅仅是借用构造函数,那么也将无法避免构造函数模式存在的问题——方法都在构造函数中定 义,因此函数复用就无从谈起了。而且,在超类型的原型中定义的方法,对子类型而言也是不可见的,结 果所有类型都只能使用构造函数模式。考虑到这些问题,借用构造函数的技术也是很少单独使用的。

猜你喜欢

转载自blog.csdn.net/banxia561/article/details/82220213
今日推荐