什么是 javascript 的原型
在接触 javascript 以前,先接触的是 c++, java 这类语言,不可避免的接受了“类”这个面向对象的实现方式。
而 javascript 则是使用“原型”(prototype)的方式实现了面向对象。同样是面向对象编程,应该说只是实现的方式不同,思想不同。
基于这样的方式不同,于是就出现了不同的继承方式:类继承和原型继承。
要想理解原型继承,就得先了解原型是如何实现面向对象的。
在 javascript 中,一切都是对象,除了例如 null 等特殊值。当我们写下如下代码时
function A(){}
js 的解析过程是:创建一个对象==> 创建一个函数。
创建的这个对象(object)就是这个函数的原型,自带两个属性 constructor 和不可见的_proto_。然后创建的这个函数,自带两个属性,name:A 和 prototype。后者是之前创建的对象的引用。
如图
这里就可以理解,原型,是函数的一个属性。
A.prototype //这个表示上图的object,表示函数的原型
同时,作为对象也是有原型的,比如上面产生的 object,它是函数的原型,是一个对象,他也有自己的原型
这个 object 的原型可以通过_proto_找到。
object._proto_ //表示对象的原型。
因为每一个对象都有这个属性,所以通过这个机制,原型会一直延续下去,直到最终的原始类 Object(js 严格区分大小写)的原型为止。
接下来就是实例化的对象的原型。例如刚才的例子
var a = new A();
a. _ proto_ //表示a的原型,指向A.prototype,也就是object
顺便一提,对象,函数和”实例化“的对象通过_proto_构成了原型链。这里 prototype 只是一个辅助。
什么是原型继承
原型继承也是继承。和 c++,java 的继承的目的是一样的。我们达到的目的应当是希望子类能够使用父类的函数等。一般的做法是通过子类构造函数来实现。
假设现在从在 A 和 B 对象,想要做到由 A 实例化的 a 能够继承 B 中的一系列属性方法。就通过原型链来连接
var A = function(){
this.name = 'A00';
};
var B = function(){
this.name = 'B00';
};
B.prototype = new A();
//上面这一步实现B继承A,其实是让B.prototype._proto_ = A.prototype
//其实_proto_并不是标准写法,ECMA就是用new字符达到目的
var a = new A();
var b = new B();
这个写法不知道标不标准。下面这个据说是 JSON 的发明者道格拉斯大佬的写法,他通过空函数 F 来做中介,达到 B 继承 A 的效果,我个人觉得本质是一样的。
F.prototype = A.prototype;
B.prototype = new F();
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于