构造借用(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)--构造借用继承的更多相关文章

  1. js原型链理解(2)--原型链继承

    1.原型链继承 2.constructor stealing(构造借用) 3.组合继承 js中的原型链继承,运用的js原型链中的__proto__. function Super(){ this.se ...

  2. js原型链理解(4)-经典继承

    经典继承就是组合继承,就是组合构造函数和原型链的优点混合继承. 1.避免引用类型的属性初始化 2.避免相同方法的多次初始化 function Super(name){ this.ages = [100 ...

  3. JS原型链理解

    1. 每个对象都有原型属性(__proto__)2. 对象的原型(__proto__)指向其构造函数(Class)的prototype属性3. 构造函数(Class)的prototype属性本身也是一 ...

  4. 深入理解JS原型链与继承

    我 觉得阅读精彩的文章是提升自己最快的方法,而且我发现人在不同阶段看待同样的东西都会有不同的收获,有一天你看到一本好书或者好的文章,请记得收藏起来, 隔断时间再去看看,我想应该会有很大的收获.其实今天 ...

  5. 简单粗暴地理解js原型链--js面向对象编程

    原型链理解起来有点绕了,网上资料也是很多,每次晚上睡不着的时候总喜欢在网上找点原型链和闭包的文章看,效果极好. 不要纠结于那一堆术语了,那除了让你脑筋拧成麻花,真的不能帮你什么.简单粗暴点看原型链吧, ...

  6. 简单粗暴地理解js原型链–js面向对象编程

    简单粗暴地理解js原型链–js面向对象编程 作者:茄果 链接:http://www.cnblogs.com/qieguo/archive/2016/05/03/5451626.html 原型链理解起来 ...

  7. JS原型链与继承别再被问倒了

    原文:详解JS原型链与继承 摘自JavaScript高级程序设计: 继承是OO语言中的一个最为人津津乐道的概念.许多OO语言都支持两种继承方式: 接口继承 和 实现继承 .接口继承只继承方法签名,而实 ...

  8. js 原型链和继承(转)

    在理解继承之前,需要知道 js 的三个东西: 什么是 JS 原型链 this 的值到底是什么 JS 的 new 到底是干什么的 1. 什么是 JS 原型链? 我们知道 JS 有对象,比如 var ob ...

  9. js原型链与继承(初体验)

    js原型链与继承是js中的重点,所以我们通过以下三个例子来进行详细的讲解. 首先定义一个对象obj,该对象的原型为obj._proto_,我们可以用ES5中的getPrototypeOf这一方法来查询 ...

随机推荐

  1. 【剑指Offer面试编程题】题目1349:数字在排序数组中出现的次数--九度OJ

    题目描述: 统计一个数字在排序数组中出现的次数. 输入: 每个测试案例包括两行: 第一行有1个整数n,表示数组的大小.1<=n <= 10^6. 第二行有n个整数,表示数组元素,每个元素均 ...

  2. maven构建项目失败----99%

    删除工作空间信息,重新导入,问题解决, 该问题,可能是安装Spring IDE 导致的问题,eclipse兼容性问题

  3. 前端学习笔记系列一:10整体移动vscode代码块、VSCode 使用 stylus,配置格式化设置、在vue项目中引入bootstrap

    1.整体移动vscode代码块 凭借操作的经验我们能够轻松地知道将代码整体往右移只需选中代码按Tab键即可.其实往左移也很简单: 选中之后按下 shift+Tab键 即可. 2.VSCode 使用 s ...

  4. ReadyBoost 的应用教程

    一.什么是ReadyBoost 根据百度百科介绍,ReadyBoost是存在于Windows Vista中的一项新技术,在继Vista的下一代操作系统Windows 7中,同样包 含着这项技术,它利用 ...

  5. PCA主成分分析算法的数学原理推导

    PCA(Principal Component Analysis)主成分分析法的数学原理推导1.主成分分析法PCA的特点与作用如下:(1)是一种非监督学习的机器学习算法(2)主要用于数据的降维(3)通 ...

  6. k-近邻算法的优缺点及拓展思考

    //2019.08.03晚#k-近邻算法的拓展思考与总结1.k-近邻算法是一种非常典型的分类监督学习算法,它可以解决多分类的问题:另外,它的整体思想简单,效果强大.它也可以用来解决回归问题,使用的库函 ...

  7. arm linux 移植 python3.6

    背景: 人生苦短,我用Python. 说明: 编译Python的嵌入式版需要解释器解析setup.py从而编译Python的模块,因此需要先编译出host的解释器.(有点像Go语言) Python : ...

  8. 61 C项目------家庭收支软件

    1,目标: ①模拟实现一个基于文本界面的<家庭收支软件> ②涉及知识点 局部变量和基本数据类型 循环语句 分支语句 简单的屏幕输出格式控制 2,需求说明: ①模拟实现基于文本界面的< ...

  9. WINccflexiable2008 的水箱控制上位机HMI仿真

    步骤1 将PLC程序编写完成,CPU为314-2DP 符号表中的符号可以被所有逻辑块调用 步骤2 组态PLC300与西门子触摸屏170系列 TP177B CLOLOR PN/DP的MPI通信. 步骤3 ...

  10. 图片索引 lire

    1:定义  LIRE( Lucene Image Retrieval)相似图像索引和搜索机制 2:资料来源     LIRE官网:http://www.semanticmetadata.net/lir ...