码迷,mamicode.com
首页 > 编程语言 > 详细

闲聊javascript继承和原型

时间:2016-01-06 00:04:14      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:

javascript继承已经是被说烂的话题了,我就随便聊一点~

一、javascript的复制继承

javascript的继承有复制继承和原型继承,基于复制继承用的不太多,而且无法通过instanceof的验证

//拷贝继承,prototype.js的extend=>
function extend(destination,source){
    for(var property in source)
    destination[property]=source[properyt];
    return destination;
}

二、javascript原型继承

js原型继承是基于原型链查找的,js每个函数都有prototype属性和__proto__属性,每个实例的__proto__属性都指向函数的prototype(es6里面实例的__proto__都指向这个函数),下面这个例子证明了这个观点。

function A(){
    console.log(this.__proto__.aa);//1 
    this.aa=2
}
A.prototype={
    aa:1
}
var a=new A;
console.log(a.aa);//2
a.__proto__={
    aa:3
}
delete a.aa;//删除特权属性
console.log(a.aa);//3

 实例在查找方法的时候按原型链查找,先找自身的属性,没有就到构造函数的prototype里找,没有再到构造函数的构造函数的prototype里找,只到Function的prototype。那我们让a的prototype等于A的实例,不就完成了继承了么。

function A(){}
A.prototype={
    aa:1
}
function bridge(){};
bridge.prototype=A.prototype;
function B(){}
B.prototype=new bridge();
B.prototype.constructor=B;

这里继承是用了一个bridge函数做了桥,因为当A有很多内容的时候,实例化A消耗比较多,而且并没有什么用,就用一个空函数做桥接一下。这里最后再改一下实例的构造函数指向自己,这就完成了继承。

var b=new B;
B.prototype.cc=function(){
    alert(3)
}
console.log(b.__proto__==B.prototype);//true
console.log(b.__proto__.__proto__===A.prototype);//true

这里b的__proto__是指向构造函数的prototype的。

 

闲聊javascript继承和原型

标签:

原文地址:http://www.cnblogs.com/dh-dh/p/5104073.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!