js高程(二)-----继承
首先来讨论一下原型链,上代码
function SuperType(){
this.property = true;
}
SuperType.prototype.getSuperValue = function(){
console.log(this.property);
}
function SubType(){
this.subproperty = false;
}
SubType.prototype = new SuperType();
SubType.prototype.getSubValue = function(){
console.log(this.subproperty);
}
var instance = new SubType();
console.log(instance.getSuperValue());//true
前三行创建了一个名为SuperType的构造器,并为其添加了一个属性propertype,其值设为true,然后在SuperType的原型上添加方法getSuperValue,功能是输出属性property的值,第一个构造函数完毕。9到11行创建第二个构造函数并添加属性subproperty,其值设为false。重点部分:第13行,把一个SuperType的实例赋值给SubType的原型。后面同样为SubType的原型添加一个方法。然后创建一个Subtype的实例,调用getSuperValue方法,返回true。
下面来仔细分析一下这条原型链,首先创造一个构造函数SuperType,它指向自己的原型,而原型的constructor有指向SuperType,这是第一部分,第二次创造了新的构造函数SubType,它的实例instance指向它的原型,而它的原型已经被设定为一个SuperType的实例,而这个实例又指向SuperType的原型,所以这部分和刚刚的第一部分就联系起来了,问题来了,instance。constructor是谁?沿着刚刚说的原型链向上找,
console.log(instance.constructor);//SuperType
同理,SuperType其实还能沿着原型链向上,上面就是Object。
第二种:借用构造函数,上代码:
function SuperType(name){
this.name = name;
}
function SubType(){
SuperType.call(this,"jiangjie");
this.age = 20;
}
var instance = new SubType();
console.log(instance.name);//jiangjie
console.log(instance.age);//
console.log(instance.constructor);//Subtype
console.log(Object.getPrototypeOf(instance)==SubType.prototype);//true
console.log(instance.hasOwnProperty("name"));//true
这样的写法就更容易理解了,使用call只是使用了Supertype的属性,但是并没有改动任何的原型链,我们可以使用hasOwnProperty来证明并不是调用了SuperType作为原型,
第三种:组合继承,上代码
function SuperType(name){
this.color = ['red','black','white'];
this.name = name;
}
SuperType.prototype.sayName = function(){
console.log(this.name);
}
function SubType(name,age){
SuperType.call(this,name);
this.age = age;
}
SubType.prototype = new SuperType();
SubType.prototype.sayAge = function(){
console.log(this.age);
}
var instance1 = new SubType('jaingjie','20');
var instance2 = new SubType('lukexin','20');
instance1.color.push('green');
console.log(instance1.color);//['red','black','white','green'];
console.log(instance1.sayName());//jiangjie
console.log(instance1.sayAge());//
console.log(instance2.color);//['red','black','white'];
console.log(instance2.sayName());//lukexin
console.log(instance2.sayAge());//
说白了就是改进版,集中各个方法所长,使用 借用构造函数 方法,来设定各自实例属性,通过原型来设定通用的方法,但是要注意,为了确保构造函数不会重写子类的属性,要在调用超类型构造函数以后,再为子类添加属性
js高程(二)-----继承的更多相关文章
- 《JS高程》创建对象的7种方式(完整版)
一.理解对象 ECMA-262定义对象:无序属性的集合,其属性可以包含基本值.对象或者属性. 我们可以把 ECMAScript 的对象想象成 散列表:无非就是一组 名值对,其中值可以是数据或函数. 创 ...
- 浅谈JS中的继承
前言 JS 是没有继承的,不过可以曲线救国,利用构造函数.原型等方法实现继承的功能. var o=new Object(); 其实用构造函数实例化一个对象,就是继承,这里可以使用Object中的所有属 ...
- 《JS高程》事件学习笔记
事件:文档或浏览器窗口中发生的一些特定的交互瞬间,也即用户或浏览器自身执行的某种动作. -------------------------------------------------------- ...
- js模拟实现继承功能
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- 【学习笔记】六:面向对象的程序设计——理解JS中的对象属性、创建对象、JS中的继承
ES中没有类的概念,这也使其对象和其他语言中的对象有所不同,ES中定义对象为:“无序属性的集合,其属性包含基本值.对象或者函数”.现在常用的创建单个对象的方法为对象字面量形式.在常见多个对象时,使用工 ...
- JS中的继承(下)
JS中的继承(下) 在上一篇 JS中的继承(上) 我们介绍了3种比较常用的js继承方法,如果你没看过,那么建议你先看一下,因为接下来要写的内容, 是建立在此基础上的.另外本文作为我个人的读书笔记,才疏 ...
- js中的继承和重载
js中有三种继承方式:一.通过原型(prototype)实现继承 二.借用构造函数式继承,可分为通过call()方法实现继承和通过apply()方法实现继承 仅仅通过原型继承我们可以发现在实例化子 ...
- 吃透Javascript数组操作的正确姿势—再读《Js高程》
Javascript中关于数组对象的操作方法比较多也比较杂,正好再次捡起<Javascript高级程序设计>来读,把它们一一总结梳理了一下: 方法类别 方法名称 方法描述 参数 返回值 备 ...
- JS创建对象、继承原型、ES6中class继承
面向对象编程:java中对象的两个基本概念:1.类:类是对象的模板,比如说Leader 这个是泛称领导,并不特指谁.2:实例:实例是根据类创建的对象,根据类Leader可以创建出很多实例:liyi,y ...
随机推荐
- Struct 和 Union 的详细区别
Union: 共用体 Struct:结构体 两者的区别: 1:共用体和结构体都是由多个不同的数据类型成员组成, 但在任何同一时刻, 共用体只存放一个被选中的成员, 而结构体则存放所有的成员变量. 2: ...
- 游戏音频技术备忘 (五)Wwise Unreal Engine 集成代码浅析 二
AkAmbientSound类的实现 Unreal Engine提供了一个基本对象的构造器ObjectInitializer,一般来说用户创建的类总是拥有很多变量,因此 AkAmbientSound ...
- 源码(08) -- java.util.ListIterator<E>
java.util.ListIterator<E> 源码分析(JDK1.7) ------------------------------------------------------- ...
- 【LeetCode题解】数组Array
1. 数组 直观地看,数组(Array)为一个二元组<index, value>的集合--对于每一个index,都有一个value与之对应.C语言中,以"连续的存储单元" ...
- maven 配置安装
1.下载maven http://maven.apache.org/ 2.windows安装maven 解压包后配置环境变量 PATH:%M2_HOME%\bin M2_HOME:D:\soft\ ...
- JS - What does `void 0` mean?
语法 void expression // or void(expression) MDN的描述 能向期望一个表达式的值是 undefined 的地方插入会产生副作用的表达式.也就是为了避免产生某种副 ...
- 解决 Eclipse build workspace validation javascript 慢的问题
参考: http://blog.csdn.net/zhangzikui/article/details/24805935 http://www.cnblogs.com/wql025/p/4978351 ...
- 初学HTML5
Document 什么是HTML5? 首先了解html:html即超文本语言,这是一种语法简单.结构清晰的语 解析型文档,他不同于其他的编程语言. html5就是html网页标记语言的第五次重大更新产 ...
- 反汇编看c++引用
继续反汇编系列,本次使用vc2008在x86体系下分析c++中的引用. 定义一个引用类型和将一个变量转换成引用类型一样吗? 引用比指针安全,真的是这样吗,对引用不理解的话比指针还危险. 为什么要用常量 ...
- phpcmsV9静态页面替换动态步骤
1.先在www目录下找到 phpcms + install_package + phpcms + templates在templates 文件夹里创建个自己的文件夹我弄得是 ceshi 文件夹,在 c ...