js:深入继承
/**
* js实现继承:
* 1.基于原型链的方式
* 2.基于伪造的方式
* 3.基于组合的方式
*/
一、基于原型链的方式
function Parent(){
this.pv = "parent";
}
Parent.prototype.showParentValue = function(){
console.log(this.pv);
}
function Child(){
this.cv = "child";
}
//让Child的原型链指向Parent,也就等于完毕了一次继承
Child.prototype = new Parent();
Child.prototype.showChildValue = function(){
console.log(this.cv);
}
var c = new Child();
c.showParentValue(); //parent
c.showChildValue(); //child
/**
*在使用原型链进行继承时,应注意下面问题:
*1.不能在设定了原型链之后,再又一次为原型链赋值
*2.一定要在原型链赋值之后才干加入或者覆盖方法
*/
使用原型链继承的缺点是:
1.无法从子类中调用父类的构造函数,
2.假设父类中存在引用类型。这个引用类型会加入到子类的原型中。假设一个对象改动了这个引用,其他对象的引用同一时候改动
所以一般都不会单纯的使用原型链来实现继承。
二、基于伪造的方式
function Parent(){
this.color = ["red","blue"];
}
function Child(){
//在Child中的this应该是指向Child的对象
//在调用Parent方法的时候,并且this又指向了Child,就等于是:this.color = ["red","blue"];
//也就等于在Child中有了this.color属性,这样也就变向的完毕了继承
Parent.call(this);
//Parent(); 这样的调用方式,仅仅是完毕了函数的调用。根本无法实现继承
}
var c1 = new Child();
c1.color.push = "green";
console.log(c1.color); //red,blue,green
var c2 = new Child();
console.log(c2.color); //red,blue
//可是这依旧不太好,例如以下:
------------------------------------------------------------------------------
function Parent(name){
this.color = ["red","blue"];
this.name = name;
/*this.say = function(){
console.log(this.name);
}*/
}
Parent.prototype.say = function(){
console.log(this.name);
}
function Child(name,age){
/**
* 使用伪造的方式就能够把子类的构造函数參数传递到父类中
* 存在问题:
* 1.因为使用的伪造方式。不会完毕Child的原型指向Parent,所以对Child来说say方法不存在
* 解决方式:
* 将这种方法放到Parent中,使用this来创建
* 可是这又引起前面提到的问题:
* 每一个Child对象都会有一个say,占用空间。所以也不应单独的使用伪造的方式实现继承。
* 因此我们要使用组合的方式来解决问题
*/
this.age = age;
Parent.call(this,name);
}
var c1 = new Child("Leon",13);
var c2 = new Child("Ada",22);
console.log(c1.name+","+c1.age);
console.log(c2.name+","+c2.age);
三、基于组合的方式
组合的方式是:属性通过伪造的方式实现。方法通过原型链的方式实现。
function Parent(name){
this.color = ["red","blue"];
this.name = name;
}
Parent.prototype.ps = function(){
console.log(this.name+",["+this.color+"]");
}
function Child(name,age){
this.age = age;
Parent.call(this,name);
}
Child.prototype = new Parent();
Child.prototype.say = function(){
console.log(this.name+","+this.age+",["+this.color+"]");
}
var c1 = new Child("Leon",22);
c1.color.push("green");
c1.say(); //Leon,22,[red,blue,green]
c1.ps(); //Leon,[red,blue,green]
var c2 = new Child("Ada",23);
c2.say(); //Ada,23,[red,blue]
c2.ps(); //Ada,[red,blue]
原创文章如转载。请注明出处,本文首发于csdn站点:http://blog.csdn.net/magneto7/article/details/25010555
js:深入继承的更多相关文章
- JS对象继承篇
JS对象继承篇 ECMAScript只支持实现继承,而且其实现继承主要是依靠原型链来实现的 原型链 其基本思路是利用原型让一个引用类型继承另一个引用类型的属性和方法 function Person() ...
- js实现继承的5种方式 (笔记)
js实现继承的5种方式 以下 均为 ES5 的写法: js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的继承机制,而是通过模仿实现的,根据js语言的本身的特性,js实现继承 ...
- js实现继承的方式总结
js实现继承的5种方式 以下 均为 ES5 的写法: js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的继承机制,而是通过模仿实现的,根据js语言的本身的特性,js实现继承 ...
- 【09-23】js原型继承学习笔记
js原型继承学习笔记 function funcA(){ this.a="prototype a"; } var b=new funcA(); b.a="object a ...
- js实现继承的两种方式
这是面试时面试官会经常问到问题: js的继承方式大致可分为两种:对象冒充和原型方式: 一.先说对象冒充,又可分为3种:临时属性方式.call().apply(): 1.临时属性方式: 当构造对象son ...
- js实现继承
js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的继承机制,而是通过模仿实现的,根据js语言的本身的特性,js实现继承有以下通用的几种方式1.使用对象冒充实现继承(该种实现 ...
- 浅谈JS的继承
JS继承 继承是OO语言中最为人津津乐道的概念,许多OO语言都支持两种方式的继承:接口继承:实现继承. 接口继承:只继承方法签名. 实现继承:继承实际的方法. 由于ES里函数没有签名,所以在ES里面无 ...
- JS类继承常用方式发展史
JS类继承常用方式发展史 涉及知识点 构造函数方式继承 1-继承单个对象 1.1 多步走初始版 1.2 多步走优化版 1.3 Object.create()方式 2-继承多个对象 2.1 遍历 Obj ...
- js实现继承的5种方式
js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的继承机制,而是通过模仿实现的,根据js语言的本身的特性,js实现继承有以下通用的几种方式1.使用对象冒充实现继承(该种实现 ...
- JS原型继承与类的继承
我们先看JS类的继承 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...
随机推荐
- 1.部署虚拟环境安装linux系统
第1章 部署虚拟环境安装linux系统 章节简述: 本章从零基础详细讲解了虚拟机软件与红帽Linux系统,完整演示了VM虚拟机的安装与配置过程,以及红帽RHEL 7系统的安装.配置过程和初始化方法.此 ...
- dubbo控制台在tomcat上的部署
1.下载dubbo-admin的war包,比如dubbo-admin-2.5.4.war 2.因为在tomcat上部署,所以务必确认安装了JDK和tomcat,以及配置好了环境变量. 3.将dubbo ...
- Policy-Based Reinforcement Learning
Policy-based Approach policy-based 强化学习通常是要学习一个actor, actor可以用\(\pi_\theta (S)\) 来确定.如果我们用actor来玩游戏, ...
- Django底层原理简介与安装
Django环境目录搭建一栏: 利用wsgiref模块封装好的socket搭建服务端: #利用wsgiref模块封装好的socket演示操作(例如accept\recv) #也可以实现socket服务 ...
- ACM程序设计选修课——1018: Common Subsequence(DP)
问题 L: Common Subsequence 时间限制: 1 Sec 内存限制: 32 MB 提交: 70 解决: 40 [提交][状态][讨论版] 题目描述 A subsequence of ...
- [USACO Section 4.4]追查坏牛奶Pollutant Control (最小割)
题目链接 Solution 一眼看过去就是最小割,但是要求割边最少的最小的割. 所以要用骚操作... 建边的时候每条边权 \(w = w * (E+1) + 1;\) 那么这样建图跑出来的 \(max ...
- python hashlib模块 logging模块 subprocess模块
一 hashlib模块 import hashlib md5=hashlib.md5() #可以传参,加盐处理 print(md5) md5.update(b'alex') #update参数必须是b ...
- angular杂谈
<element ng-include="filename" onload="expression" autoscroll="expressio ...
- Linux 之 Redis
Linux 之 Redis 参考教程:[千峰教育] 一.Redis简介: 说明: 1.也是一种类似于Memcached的key-value机制的存储服务 2.是非关系型数据库(NoSQL)的一种 3. ...
- html css的简单学习(二)
html css的简单学习(二) <!Doctype html>告诉浏览器,这是一个html文档.lang="en" 默认是en,表示英语:zh-Hans 中文简体:z ...