javascript继承—prototype最优两种继承(空函数和循环拷贝)
来源:互联网 发布:mac升级失败系统丢失 编辑:程序博客网 时间:2024/04/30 01:17
一、利用空函数实现继承
参考了文章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最优两种继承(空函数和循环拷贝)
- JavaScript的两种面向对象方法--原型继承(prototype)和函数继承(闭包)
- JavaScript之继承和prototype
- Javascript构造函数和prototype实现封装继承
- Javascript中继承和Prototype的关系
- Javascript中继承和Prototype的关系
- Javascript中继承和Prototype的关系
- JavaScript类和继承:prototype属性
- JavaScript类和继承(1):prototype属性
- JavaScript类和继承:prototype属性
- JavaScript类和继承:prototype属性
- Javascript中的prototype和继承机制
- javascript的prototype继承
- javascript的prototype继承
- javascript prototype 继承
- javascript的prototype继承
- javascript的prototype继承
- javascript的prototype继承
- python 学习笔记之 算术运算符(除法)
- 【codechef】 Count Substrings (大数技巧题)(二分+计数,易超时)
- android基本布局之LinearLayout
- php基础之常用图片处理类
- json应用,responseText,responseXml,XMLhttpRequest和ajax开发框架
- javascript继承—prototype最优两种继承(空函数和循环拷贝)
- eclipse快捷键
- 黄金时代环境
- Thinkphp基础之输入类处理
- DeepLearning工具Theano学习记录(三) CNN卷积神经网络
- 【Unity3D插件】在Unity中读写文件数据:LitJSON快速教程 - 王选易
- android背景选择器
- vim使用教程(全)-最好的编辑器
- copy data from difrent version hadoop