js原型链理解(3)--构造借用继承
构造借用(constructor strealing)
1.为什么已经存在原型链继承还要去使用构造借用
首先看一下这个例子
function Super(){
this.sets = [0,1,2];
}
Super.prototype.age = 100;
function Sub(){
this.subValue = 100;
}
Sub.prototype = new Super();
Sub.prototype.setAge = function(){
console.log(this.subValue);
}
var obj1 = new Sub();
obj1.sets[0] = 200;
var obj2 = new Sub();
console.log(obj2.sets[0]);
输出的结果是200,仅仅使用原型链,一个由继承的构造创建的对象只是改变自己的属性值,却把构造的属性值给改了,这当然是不希望被看到的事情。
为什么会出现这样的情况
原因是:
Sub.prototype = new Super(); 以后 Sub.prototype = { set: [0, 1, 2], __proto__:...} set属性是实例化的,obj1.set获取的是Sub原型对象的属性,
因为是引用类型,所以值被修改了。
那么 如何改变这个值被修改的问题。运用构造借用constructor strealing,我觉得这个翻译一点也不直接,构造 盗窃,就是使用别人的构造初始化自己的this

subnew 是Sub 构建的对象,它的set属性是重新生成的,因为创建的时候,this会去盗窃Super的方法,初始化了this, Sub的this被定义了sets属性。
相当于Sub(){ this.sets = [0,1,2]}这样就实现了对超类的引用类型的继承。可以在call 里面传参数,实现特殊的值的初始化。
总结:
从普通构造函数到超类构造函数,引用类型的值的定义都是运用构造去初始化的。构造中的值都会在对象初始化的时候,重新去创建,去占内存空间。
那么如果我既想使用原型链去实现一些基础变量的初始化和方法的实现来减少内存的使用,又想利用构造去初始化引用类型的变量,如何实现呢?使用组
合继承,也叫经典继承。
我发现我看了很多博客写的对原型链和继承的解释我都没懂,但是我看书大概好像是看明白了。而且没懂之前觉得这个特别特别难,现在理解了觉得其实很简单,而且感觉也没花多少时间。而且之前胡乱的保存了一堆文档,把保存当成理解。所以还是建议大家不明白的去看这本书《JavaScript高级程序设计》。
js原型链理解(3)--构造借用继承的更多相关文章
- js原型链理解(2)--原型链继承
1.原型链继承 2.constructor stealing(构造借用) 3.组合继承 js中的原型链继承,运用的js原型链中的__proto__. function Super(){ this.se ...
- js原型链理解(4)-经典继承
经典继承就是组合继承,就是组合构造函数和原型链的优点混合继承. 1.避免引用类型的属性初始化 2.避免相同方法的多次初始化 function Super(name){ this.ages = [100 ...
- JS原型链理解
1. 每个对象都有原型属性(__proto__)2. 对象的原型(__proto__)指向其构造函数(Class)的prototype属性3. 构造函数(Class)的prototype属性本身也是一 ...
- 深入理解JS原型链与继承
我 觉得阅读精彩的文章是提升自己最快的方法,而且我发现人在不同阶段看待同样的东西都会有不同的收获,有一天你看到一本好书或者好的文章,请记得收藏起来, 隔断时间再去看看,我想应该会有很大的收获.其实今天 ...
- 简单粗暴地理解js原型链--js面向对象编程
原型链理解起来有点绕了,网上资料也是很多,每次晚上睡不着的时候总喜欢在网上找点原型链和闭包的文章看,效果极好. 不要纠结于那一堆术语了,那除了让你脑筋拧成麻花,真的不能帮你什么.简单粗暴点看原型链吧, ...
- 简单粗暴地理解js原型链–js面向对象编程
简单粗暴地理解js原型链–js面向对象编程 作者:茄果 链接:http://www.cnblogs.com/qieguo/archive/2016/05/03/5451626.html 原型链理解起来 ...
- JS原型链与继承别再被问倒了
原文:详解JS原型链与继承 摘自JavaScript高级程序设计: 继承是OO语言中的一个最为人津津乐道的概念.许多OO语言都支持两种继承方式: 接口继承 和 实现继承 .接口继承只继承方法签名,而实 ...
- js 原型链和继承(转)
在理解继承之前,需要知道 js 的三个东西: 什么是 JS 原型链 this 的值到底是什么 JS 的 new 到底是干什么的 1. 什么是 JS 原型链? 我们知道 JS 有对象,比如 var ob ...
- js原型链与继承(初体验)
js原型链与继承是js中的重点,所以我们通过以下三个例子来进行详细的讲解. 首先定义一个对象obj,该对象的原型为obj._proto_,我们可以用ES5中的getPrototypeOf这一方法来查询 ...
随机推荐
- [Database] MAC MySQL中文乱码问题
1 确保数据库编码设置, 可修改my.cnf mysql> show variables like '%character%'; +--------------------------+---- ...
- Hystrix熔断机制导致误报请求超时错误
问题的过程如下: (1)前端向服务端请求往HBase插入1000条数据: (2)请求经路由网关Zuul传递给HBaseService,HBaseService执行插入操作: (3)插入操作需要的时间超 ...
- MyBatisPlus代码生成 mvc项目
package com.test; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus ...
- SystemVerilog基本语法总结(下)
2018年IC设计企业笔试题解析-(验证方向) 1.请简述:定宽数组,动态数组,关联数组,队列四种数据类型的各自特点.解析:(1)定宽数组:其宽度在声明的时候就指定了,故其宽度在编译时就确定了.(2) ...
- Python 网络编程之网络协议(未完待续)
一:网络编程从两大架构开始 1.网络开发的两大架构 c/s 架构 : client server B/S 架构 : Brower server (1)bs 和 cs 架构之间的关系? (2)哪一种 ...
- scikit_learn (sklearn)库中NearestNeighbors(最近邻)函数的各参数说明
NearestNeighbors(n_neighbors=5, radius=1.0, algorithm='auto', leaf_size=30, metric='minkowski', p=2, ...
- python中单下划线的变量
1._xxx 不能用于’from module import *’ 以单下划线开头的表示的是protected类型的变量.即保护类型只能允许其本身与子类进行访问.2.__xxx 双下划线的表示的是私有 ...
- 蓝牙 BLE 协议学习: 001-BLE协议栈整体架构
背景 在深入BLE协议帧之前,我们先看一下BLE协议栈整体架构. 转载自:<深入浅出低功耗蓝牙(BLE)协议栈> 架构 如上图所述,要实现一个BLE应用,首先需要一个支持BLE射频的芯片, ...
- 读《Adaptive Thresholding Using the Integral Image》自适应图像阈值
图像的二值化问题总是一个问题.虽然使用深度学习的方法取得了不小的进展,但是传统的方法还是值得借鉴. 刚好随机游走到这篇文章 挖个07年的坟 地址:http://people.scs.carleton ...
- py交易
下载之后发现是pyc文件,反编译一下 网站:https://tool.lu/pyc/ 发现其实就是base64转换为16进制,然后减去16再和32异或,就可以得到答案了 nctf{d3c0mpil1n ...