闲聊javascript继承和原型
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继承和原型的更多相关文章
- JavaScript -- 继承与原型链
JavaScript对象有一个指向一个原型对象的链,当试图访问一个对象的属性的时候,他不仅仅会在该对象上面搜寻,还会搜寻该对象的原型,以及对象的原型的原型,依次层层搜索,直到找到名字匹配的属性或者到达 ...
- javascript继承之原型链(一)
function Father() { this.fatherValue = "爸爸"; } Father.prototype.getFatherValue = function ...
- JavaScript继承与原型链
对于那些熟悉基于类的面向对象语言(Java 或者 C++)的开发者来说,JavaScript 的语法是比较怪异的,这是由于 JavaScript 是一门动态语言,而且它没有类的概念( ES6 新增了c ...
- JavaScript继承总结
1.创建对象 1.字面量对象 2.构造函数 3.Object.create //1.字面量 var obj={ name: '字面量', show: function(){ console.log(t ...
- javascript中的原型和继承
javascript一直是初学者口中的难点,甚至一些有些许工作经验的人也不太明白其中的原理,而我就是那个初学者,前段时间在阮一峰老师的博客上看了一篇文章<javascript继承机制的设计思想& ...
- 【转】JavaScript中的原型和继承
请在此暂时忘记之前学到的面向对象的一切知识.这里只需要考虑赛车的情况.是的,就是赛车. 最近我正在观看 24 Hours of Le Mans ,这是法国流行的一项赛事.最快的车被称为 Le Mans ...
- 理解JavaScript中的原型继承(2)
两年前在我学习JavaScript的时候我就写过两篇关于原型继承的博客: 理解JavaScript中原型继承 JavaScript中的原型继承 这两篇博客讲的都是原型的使用,其中一篇还有我学习时的错误 ...
- JavaScript之继承(原型链)
JavaScript之继承(原型链) 我们知道继承是oo语言中不可缺少的一部分,对于JavaScript也是如此.一般的继承有两种方式:其一,接口继承,只继承方法的签名:其二,实现继承,继承实际的方法 ...
- JavaScript 类式继承与原型继承
交叉着写Java和Javascript都有2年多了,今天来总结下自己所了解的Javascript类与继承. Javascript本身没有类似Java的面向对象的类与继承术语,但其基于原型对象的思想却可 ...
随机推荐
- 在JavaEE中使用Mybatis框架
MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录.每个MyB ...
- Hbase表结构模型
- valgrind 检查内存泄露
https://www.oschina.net/translate/valgrind-memcheck
- uname -r查询版本不是安装的版本的问题
uname -r 查出来的版本与/lib/modules下面的内核版本不匹配.啥原因? 第一步,先strace uname -r看看这个uname -r到底从哪里获取的版本. strace没有看出来 ...
- Lodop打印控件打印机可打区域的影响 设置纸张边缘为基点
由于打印机千差万别,打印开发也要注意针对客户各种打印机进行处理,Lodop提供了打印维护(PRINT_SETUP)可针对每个客户端进行微调,保存结果保存在客户端本地,对其他访问网站的客户没有影响. 由 ...
- oracle 触发器详情
Oracle PL/SQL编程之八: 把触发器说透 本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触 ...
- react事件绑定,事件传参,input单向数据绑定
import React, { Component } from 'react'; class New extends Component { constructor(props){ super(pr ...
- vpx
VPX 编辑 本词条缺少名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! VPX总线是VITA(VME International Trade Association, VME国际贸易协 ...
- 51nod2383
2383 高维部分和 1 秒 131,072 KB 80 分 5 级题 输入一个长度为n的数组a[i],下标从0开始(0到n-1)保证n是2的整数次幂,对于每个i (0 <= i < ...
- codeforces431C
k-Tree CodeForces - 431C Quite recently a creative student Lesha had a lecture on trees. After the l ...