一、利用空函数实现继承

参考了文章javascript继承—prototype属性介绍(2) 中叶小钗的评论,对这篇文章中的方案二利用一个空函数进行修改,可以解决创建子类对象时,父类实例化的过程中特权属性和特权方法,私有属性,私有方法的空耗资源问题。

复制代码

function Person(name,age){

this.name = name;

this.age = age;

}

Person.prototype = {

constructor:Person,

sayHi:function(){

alert(‘hi’);

}

}

function Student(name,age,grade){

Person.call(this,name,age);

this.grade = grade;

}

function Empty(){}

Empty.prototype = Person.prototype;

Student.prototype = new Empty();

Student.prototype.constructor = Student;

var p1 = new Person(‘xiaoming’,10);

var s1 = new Student(‘xiaohong’,9,3);

console.log(p1);//Person { name=”xiaoming”, age=10, sayHi=function()}

console.log(s1);//Student {name=”xiaohong”, age=9, grade=3, 更多…}

console.log(p1.constructor);//Person(name,age) 父类的实例指向仍是父类

console.log(s1.constructor);//Student(name,age,grade) //子类的实例指向仍是子类

复制代码

这种情况下修改Student的prototype就不会影响到Person的prototype对象了,并且,因为直接将Person的prototype赋给Empty的prototype,所以不会存在特权属性(实例属性)浪费资源的问题。这样利用空函数就能很好的解决共有方法的继承问题了。当然这时Student.prototype中的constructor是Person,所以最好加上Student.prototype.constructor = Student转换过来。

二、利用循环遍历拷贝的方法实现继承

同样对于文章javascript继承—prototype属性介绍(2)中的方案三,其实这是一种拷贝的方法,将父类所有的共有方法拷贝到子类中去。

复制代码

function Person(name,age){

this.name = name;

this.age = age;

}

Person.prototype = {

constructor:Person,

sayHi:function(){

alert(‘hi’);

}

}

function Student(name,age,grade){

Person.call(this,name,age);

this.grade = grade;

}

for(var i in Person.prototype){Student.prototype[i] = Person.prototype[i]}

Student.prototype.constructor = Student;

Student.prototype.study = function(){

alert(‘study’);

}

var p1 = new Person(‘xiaoming’,10);

var s1 = new Student(‘xiaohong’,9,3);

console.log(p1);//Person { name=”xiaoming”, age=10, sayHi=function()}

console.log(s1);//Student { name=”xiaohong”, age=9, grade=3, 更多…}

console.log(p1.constructor);//Person(name,age) 父类的实例指向仍是父类

console.log(s1.constructor);//Student(name,age,grade) //子类的实例指向仍是子类

复制代码

这种方法直接将父类的共有方法利用遍历的模式拷贝到子类中去。这样就避免了子类实例直接指向父类的问题,也不会出现修改子类的共有方法,对父类产生了影响。也算一种比较完美的继承。

javascript继承—prototype最优两种继承(空函数和循环拷贝)的更多相关文章

  1. javascript继承(五)—prototype最优两种继承(空函数和循环拷贝)

    一.利用空函数实现继承 参考了文章javascript继承—prototype属性介绍(2) 中叶小钗的评论,对这篇文章中的方案二利用一个空函数进行修改,可以解决创建子类对象时,父类实例化的过程中特权 ...

  2. JavaScript对象属性访问的两种方式

    JavaScript对象属性访问的两种方式 object.attribute object["attribute"] 例如: var employees = [ { "f ...

  3. ( function(){…} )()和( function (){…} () )是两种立即执行函数

    函数声明:function fnName () {…};函数表达式 var fnName = function () {…};匿名函数:function () {}; fnName(); functi ...

  4. JavaScript数组去重—ES6的两种方式

    说明 JavaScript数组去重这个问题,经常出现在面试题中,以前也写过一篇数组去重的文章,(JavaScript 数组去重的多种方法原理详解)但感觉代码还是有点不够简单,今天和大家再说两种方法,代 ...

  5. javascript中实现sleep的两种方式

    最近在js中要使用到类似于C++中的sleep函数(让cpu休眠).但是js是不可能让cpu休眠,所以可以通过下面的两种方式模拟sleep函数. 方式一:使用setTimeout函数代替.如果在一个循 ...

  6. 用javascript获得地址栏参数的两种方法

    javascript获得地址栏参数. 方法1: <script language="JavaScript"> //取地址栏参数 <!-- function Req ...

  7. JavaScript模板引擎artTemplate.js——两种方法实现性别的判定

    template.helper(name, callback) name:必传,辅助事件的名称. callback:必传,辅助事件的回调函数. return:undefined 所谓的辅助事件,主要用 ...

  8. javascript 实现字符串反转的两种方法

    第一种方法:利用数组方法 //先split将字串变成单字数组,然后reverse()反转,然后将数组拼接回字串 var str = "abcdef"; str.split(&quo ...

  9. JavaScript 区分中英文字符的两种方法: 正则和charCodeAt()方法

    正则无疑是最强大的判断各种条件的方法, 最近也在研习它, 虽然枯燥, 但仍有乐趣. 用它来判断一个双字节的中文字符也是轻而易举地. 而判断中文字符,  简单且执行效率高. regExpForm.onb ...

随机推荐

  1. VS2005调试无法进入断点,暂停、停止、重编按钮为灰色

    没装IE8之前(IE7),Vs2005调试还好用,装了IE8之后, Vs2005的WebSite程序按F5无法正常调试. 需要手动附加到进程, 比较麻烦, 据说还有种方法, 把所有IE窗口都关掉, 再 ...

  2. Python学习杂记_12_函数(三)

    内置函数 Python有很多内置函数,以下这些是常用且必须要掌握的: 强制类型转换: bool() # 把一个对象转换成布尔类型 int() # 整形 float() # 小数 str() # 字符 ...

  3. Vue.js入门第一课

    这个好像比ANGULAR.JS要轻量一些,看看. <!DOCTYPE html> <html> <head> <meta charset="utf- ...

  4. (2).net web api 请求方式与参数

    一.GET 二.POST 如果方法名前缀不带GET 默认为POST请求方法 1.无参数 2.带一个参数 客户端请求时,名称必须为空,不能是dictCategory.不是空的话,会返回空数据 [ ] 3 ...

  5. hdu6035(树形DP)

    hdu6035 题意 给出一棵树,现在定义两点之间距离为两点间最短路径上颜色集合的大小.问任意两点间距离之和. 分析 换个方向,题目其实等价于求每种颜色在多少条路径上出现过(每种颜色对于答案的贡献), ...

  6. 洛谷 P4212 外太空旅行

    题目描述 在人类的触角伸向银河系的边缘之际,普通人上太空旅行已经变得稀松平常了.某理科试验班有n个人,现在班主任要从中选出尽量多的人去参加一次太空旅行活动. 可是n名同学并不是和平相处的.有的人,比如 ...

  7. ssh框架整合shiro权限

    关于整合shiro,首先在ssh整合的基础上进行组合 1.首先,要导入几个依赖(整合ssh与shiro的依赖): <properties><shiro.version>1.3. ...

  8. jsp登陆

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

  9. Netbeans 中部署运行Webservice出错

      错误如下 at java.lang.StackTraceElement at public java.lang.StackTraceElement[] java.lang.Throwable.ge ...

  10. 【微信】微信小程序 获取本次场景值

    场景值: 代表从何处进入小程序的.代表小程序的入口场景值. 注意: 1>目前仅可以在 App 的 onlaunch 和 onshow 中获取上述场景值 获取场景值的方法: //在小程序的onLa ...