javascript中的承继[四] 总结(《Object娱乐之横扫全球 - 娱乐之横扫全球

javascript中的承继[四] 总结(《Object娱乐之横扫全球

2019年02月16日11时39分40秒 | 作者: 凝丝 | 标签: 承继,原型,办法 | 浏览: 15577

     第六章介绍了一些承继的办法,分为两形式:

        根据结构函数生成目标的形式

        直接承继目标的形式

    也能够依照另一种思路分类:

        运用了原型prototype

        仿制特点

        仿制原型的特点

 

能够说,这是完成承继的最中心的内容,实践中常常交织在一起。回忆下前文介绍的根本承继办法:

//结构函数 运用原型链
Coder.prototype = new Person("无名");
//结构函数 同享原型链
Coder.prototype = Person.prototype;
//结构函数 运用原型链 只承继原型特点办法
function extend(Child,Parent){
 var F = function(){};
 F.prototype = Parent.prototype;
 Child.prototype = new F();
 Child.prototype.constructor = Child;
//结构函数 运用原型链 仿制原型特点
function extend2(Child,Parent){
 var p = Parent.prototype;
 var c = Child.prototype;
 for(var i in p){
 c[i] = p[i];
//承继目标 仿制特点
function extendCopy(p, c){
 var c = c || {};
 for(var i in p){
 c[i]=p[i];
 return c; 
//承继目标 深仿制
function deepCopy(){}
//承继目标 运用原型链
function object(o){
 function F(){};
 F.prototype = o;
 return new F();
//承继目标 运用原型链 仿制特点
function objectPlus(o, stuff){}
//承继目标 仿制特点
function multi(){}

 

留传的一些工作

1.之前的文章中出现以下代码

function Person(name){
 this.name = name;
Person.prototype.sayHello = function(){
 alert(this.name);
function Coder(name,language){
 this.language = language;
 this.name = name;
Coder.prototype = new Person("无名");
Coder.prototype.constructor = Coder;
Coder.prototype.code = function(){
 alert("i am a "+this.language+" coder");
};

咱们改造下这段代码,首要处理子类调用父类的结构函数中初始化代码,自行比照优缺点:

function Person(name){
 this.name = name;
Person.prototype.sayHello = function(){
 alert(this.name);
function Coder(name,language){
 Person.apply(this,arguments);
 this.language = language;
extend2(Coder,Person);
Coder.prototype.code = function(){
 alert("i am a "+this.language+" coder");
};

经过 Person.apply(this,arguments)调用父类的结构办法,extend2承继父类的原型办法,最终再扩展原型办法。

假如扩展的原型办法许多,我想你一定有办法知道假如经过之前的根底办法,写出一个新的契合你自己要求的承继机制。

咱们完全能够写一个 extend3(Coder,Person,stuff)的办法~假如你有需求这么做的话。

2.几个函数操作

obj instanceof F // 判别目标obj是否是F的实例

F.prototype.isPrototypeOf(obj)//作用同上

obj.constructor // 回来obj的结构函数 

obj.hasOwnProperty(特点名) // 判别obj是否有归于自己的特点,而不是他所指原型的特点

 

这几个操作协助了解原型链、承继进程,在实践中也有很重要的作用。

3.关于 子“类”调用父"类"的办法、特点

有三个类 Shape TwoDShape Triangle 形状、2D形状、三角形,他们承继联系。

目标实例需求完成一种办法:toString() 不只要输出自己的类名,还要输出祖辈的类名。

怎么完成呢?

因为承继的完成办法挺多的,并且子“类”的这种需求千变万化,怎么有用操控,文章(自己才能有限)一句话说不清楚,《o-o》中也仅仅交叉地说了一下。

根本的一种思路是 在 Parent加一个静态特点uber指向Child.prototype


function extend(Child,Parent){
 var F = function(){};
 F.prototype = Parent.prototype;
 Child.prototype = new F();
 Child.prototype.constructor = Child;
 Child.uber = Parent.prototype;
}
function Shape(){};
Shape.ptototype.name = "shape";
Shape.prototype.toString = function(){
 var result = [];
 if(this.constructor.uber){
 result[result.length] = this.constructor.uber.toString();
 result[result.length] = this.name;
 return result.join(, );
function TwoDShape(){};
extend(TwoDShape,Shape);
TwoDshape.prototype.name = "2dShape";
function Triangle(side, height){
 this.side = side;
 this.height = height;
extend(Triangle, TwoDShape);
Triangle.prototype.name = "triangle";
Triangle.prototype.getArea = function(){return this.side*this.height/2;};
var my = new Triangle(3,4);
my.toString();

仿制原型特点的时分

function extend2(Child,Parent){
 var p = Parent.prototype;
 var c = Child.prototype;
 for(var i in p){
 c[i] = p[i];
 c.uber = p;
}

 

目标直接承继的时分

function object(o){
 var n;
 function F(){}
 F.prototype = o;
 n = new F();
 n.uber = o;
 return n;
}

 

上面的完成 都是 《o-o》第六章中提及的

实例、原型、结构函数  谁能够最直接地调用办法uber ,以及要发生什么作用,按需完成。

uber 是源于德语,super是js中的一个关键词,因而主张运用uber

 

到此,《o-o》第六章的内容都介绍结束,内容根据自己的整理,增加了自己的了解,不免有遗漏之处,请纠正。

欢迎我们看原著,国内也出了翻译版~

 

 

 

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表娱乐之横扫全球立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章