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 ...
随机推荐
- js面试题-2
// 1.截取字符串 var aa = "abcd"; console.log(aa.substr(,)); var str = "qweda"; consol ...
- 使用jsCompress压缩混淆js代码的一些常见的问题和技巧
不同的团队使用的js混淆器或压缩工具不一样,jsCompress是一款绿色的免费的js压缩工具,时代定制的UI团队推荐大家使用,不仅性能优越,而且操作非常人性化. 使用jsCompress.exe时, ...
- (原创)Java多线程作业题报java.lang.IllegalMonitorStateException解决
作业: 有一个水池,水池容量500L,一边为进水口,一边为出水口,要求进水放水不能同时进行,水池一旦满了不能继续注水,一旦空了,不能继续放水,进水速度5L/s,放水速度2L/s. 这是我学多线程时做的 ...
- HTML5 技术在风电、光伏等新能源领域的应用
随着新一轮工业革命兴起,应对气候变化日益成为全球共识,能源技术正在成为引领能源产业变革.实现创新驱动发展的源动力.从全球到中国,以风能.光伏发电为代表的新能源产业发展迅速,可再生能源发电与现代电网的融 ...
- 【.Net Framework 体积大?】不安装.net framework 也能运行!?原理简介-2
接上一篇 [.Net Framework 体积大?]不安装.net framework 也能运行!?开篇叙述-1 昨天写了一个引子,还是有读者对这套“小把戏”感兴趣.那么不辜负大家的希望,争取博主不做 ...
- C# Web.config 配置handlers 和 httpHandlers
<system.web> <httpHandlers> <add verb="*" path="*.js.axd" type=&q ...
- Ubuntu纯字符界面的一些设置
由于Ubuntu的纯字符界面不支持中文显示,所以进行了一些配置,为了更好的显示 1. 把环境语言配置为英文 在用户目录下的".bashrc"文件的结尾处添加以下内容,然后重新登录 ...
- 转:微信生成二维码java
package com.wepayweb.weixin.util.device; /*** * V型知识库 www.vxzsk.com */ import java.io.BufferedReader ...
- jvm的内存空间分区
在方法(代码块)中定义一个变量时,java就在栈中为这个变量分配JVM内存空间,当超过变量的作用域后,java会自动释放掉为该变量所分配的JVM内存空间:而在堆中分配的JVM内存由java虚拟机的自动 ...
- axios全攻略
随着 vuejs 作者尤雨溪发布消息,不再继续维护vue-resource,并推荐大家使用 axios 开始,axios 被越来越多的人所了解.本来想在网上找找详细攻略,突然发现,axios 的官方文 ...