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);//
a.__proto__={
aa:3
}
delete a.aa;//删除特权属性
console.log(a.aa);//

实例在查找方法的时候按原型链查找,先找自身的属性,没有就到构造函数的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的。

三、基于object的原型继承:

 const extend  =  (to, from) => {
// TODO: use `Reflect.ownKeys()` when targeting Node.js 6
for (const prop of Object.getOwnPropertyNames(from).concat(Object.getOwnPropertySymbols(from))) {
Object.defineProperty(to, prop, Object.getOwnPropertyDescriptor(from, prop));
} return to;
};

闲聊javascript继承和原型的更多相关文章

  1. JavaScript -- 继承与原型链

    JavaScript对象有一个指向一个原型对象的链,当试图访问一个对象的属性的时候,他不仅仅会在该对象上面搜寻,还会搜寻该对象的原型,以及对象的原型的原型,依次层层搜索,直到找到名字匹配的属性或者到达 ...

  2. javascript继承之原型链(一)

    function Father() { this.fatherValue = "爸爸"; } Father.prototype.getFatherValue = function ...

  3. JavaScript继承与原型链

    对于那些熟悉基于类的面向对象语言(Java 或者 C++)的开发者来说,JavaScript 的语法是比较怪异的,这是由于 JavaScript 是一门动态语言,而且它没有类的概念( ES6 新增了c ...

  4. JavaScript继承总结

    1.创建对象 1.字面量对象 2.构造函数 3.Object.create //1.字面量 var obj={ name: '字面量', show: function(){ console.log(t ...

  5. javascript中的原型和继承

    javascript一直是初学者口中的难点,甚至一些有些许工作经验的人也不太明白其中的原理,而我就是那个初学者,前段时间在阮一峰老师的博客上看了一篇文章<javascript继承机制的设计思想& ...

  6. 【转】JavaScript中的原型和继承

    请在此暂时忘记之前学到的面向对象的一切知识.这里只需要考虑赛车的情况.是的,就是赛车. 最近我正在观看 24 Hours of Le Mans ,这是法国流行的一项赛事.最快的车被称为 Le Mans ...

  7. 理解JavaScript中的原型继承(2)

    两年前在我学习JavaScript的时候我就写过两篇关于原型继承的博客: 理解JavaScript中原型继承 JavaScript中的原型继承 这两篇博客讲的都是原型的使用,其中一篇还有我学习时的错误 ...

  8. JavaScript之继承(原型链)

    JavaScript之继承(原型链) 我们知道继承是oo语言中不可缺少的一部分,对于JavaScript也是如此.一般的继承有两种方式:其一,接口继承,只继承方法的签名:其二,实现继承,继承实际的方法 ...

  9. JavaScript 类式继承与原型继承

    交叉着写Java和Javascript都有2年多了,今天来总结下自己所了解的Javascript类与继承. Javascript本身没有类似Java的面向对象的类与继承术语,但其基于原型对象的思想却可 ...

随机推荐

  1. 区块链教程(二):比特币、区块链、以太坊、Hyperledger的关系

    不知道大家喜不喜欢音乐! 朋克音乐:诞生于七十年代中期,一种源于六十年代车库摇滚和前朋克摇滚的简单摇滚乐.它由一个简单悦耳的主旋律和三个和弦组成,经过演变,朋克已经逐渐脱离摇滚,成为一种独立的音乐,朋 ...

  2. Json详解以及fastjson使用教程

    Json是一种轻量级的数据交换格式,采用一种“键:值”对的文本格式来存储和表示数据,在系统交换数据过程中常常被使用,是一种理想的数据交换语言.在使用Java做Web开发时,不可避免的会遇到Json的使 ...

  3. [转帖]Windows注册表内容详解

    Windows注册表内容详解 来源:http://blog.sina.com.cn/s/blog_4d41e2690100q33v.html 对 windows注册表一知半解 不是很清晰 这里学习一下 ...

  4. mybatis两种开发方式

    本文首先讲解从JDBC到mybatis的演变过程,然后是使用mybatis进行开发的两种方式. 一 JDBC的使用及其优化 1.使用JDBC进行数据库操作 加载JDBC驱动: 建立并获取数据库连接: ...

  5. springboot+ELK+logback日志分析系统demo

    之前写的有点乱,这篇整理了一下搭建了一个简单的ELK日志系统 借鉴此博客完成:https://blog.csdn.net/qq_22211217/article/details/80764568 设置 ...

  6. CLOUD SQL跟踪

    CLOUD会自动在后台执行一些sql语句,所以追踪起来比较麻烦,需要加入一些过滤条件. 比如关键的CLIENTPROCESSID,加入后 ,就能过滤是哪个客户度执行的数据. 过滤数据.

  7. 关于手机端适配的问题(rem,页面缩放)

    关于手机端适配的问题(rem,页面缩放) 96 进击的小前端 关注 2018.02.02 13:57 字数 320 阅读 19评论 0喜欢 0 相信很多和会和我碰到一样的情况,就是你用rem去写移动端 ...

  8. combineByKey

    示例:

  9. scrapy几种反反爬策略

    一.浏览器代理 1.直接处理: 1.1在setting中配置浏览器的各类代理: user_agent_list=[ "Mozilla/5.0 (Windows NT 10.0; Win64; ...

  10. IntelliJ IDEA详情

    详情请参考http://www.phperz.com/article/15/0923/159043.html