function inherit(Target,Origin){
function F(){};
F.prototype = Origin.prototype;  //
Targrt.prototype = new F();
Target.prototype.constructor = Target;  //增加自己的constructor
Target.prototype._super = Origin;  //找到自己的超类
}

function F(){};    中间函数
F.prototype = Origin.prototype;  
Targrt.prototype = new F();
或者

function proto(target,obj){
function Fn(){};
Fn.prototype = obj.prototype;
target.prototype = new Fn();
}
function proto2(target,obj){
function Fn(){};
Fn.prototype = obj.__proto__;
target.__proto__ = new Fn();
}
function son(){
this.name = 'tom';
};
function father(){
this.name = 'jim';
};
father.prototype = {
lastName:'Green'
}
//proto(son,father);
var s1 = new son();
var f1 = new father();
proto2(s1,f1);
console.log(s1.lastName);

类似的方法:原型继承

function Obj(o){
function f(){};
f.prototype = o;
return new f();
} function person(name,age){
this.name = name;
this.age = age;
} person.prototype.say = function(){
console.log(this.name+' : '+this.age);
}
var p1 = Obj(new person('zhangsan',23));
var p2 = Obj(new person('zhangsan',23));
console.log(p1);
console.log(p2);
console.log(p1.__proto__ === p2.__proto__);//false
console.log(p1.__proto__.__proto__ === p2.__proto__.__proto__);//true
p1.name1 = 'zhangsan';
p2.name1 = 'lisi';
p1.__proto__.name = 'liuliu';
console.log(p1);
console.log(p2);
//so要把原型的constructor回归到原型
p1.__proto__.constructor = person;
p1.__proto__._superProto = person.prototype;
console.log(p1.__proto__.constructor);
console.log(p1.__proto__._superProto);

闭包形式

        var inherit = (function(){
var F = function(){}
return function(Target,Origin){
F.prototype = Origin.prototype;
Target.prototype = new F();
Target.prototype.constructor = Target;
Target.prototype._super = Origin;
console.log(1);
}
}())
function Father(){};
Father.prototype.name = 'zhang';
function Son(){};
inherit(Son,Father);
var father = new Father();
var son = new Son();
console.log(son.name);
问题:
var father = new Father();
var son = new Son();//son指向一个Son()对象 ,(son.__proto__ === Son.prototype)Son.prototype指向一个空间,
inherit(Son,Father);//Son.prototype指向了另一个空间,但是son.__proto__指向的空间并没有变化,所以name属性找不到 
console.log(son.name);//undefined

实例:
        function Father(){};
Father.prototype.lastName = 'Zhangsan';
var F = new Father();
function Son(){};
Father.prototype = new Son();
var P = new Father();
console.log(F.lastName);//zhangsan
console.log(P.lastName);//undefined

继承方法-->最终模式的更多相关文章

  1. JavaScript 方法调用模式和函数调用模式

    这两天在读<JavaScript语言精粹>关于第4章函数调用的几种模式琢磨了半天. 这里就说一下方法调用模式跟函数调用模式. 方法调用模式: 当一个函数被保存为对象的一个属性时,我们称它为 ...

  2. js继承的几种方法和es6继承方法

        一.原型链继     1.基本思想     利用原型链来实现继承,超类的一个实例作为子类的原型     2.具体实现     function F() {}     //原型属性,原型方法: ...

  3. javascript创建对象的方法--原型模式

    javascript创建对象的方法--原型模式 一.总结 1.原型模式解决内存浪费的方法(继承):通过继承,对象继承原型模式下的所有属性,对象不同于其它对象的的属性自己创建或者修改 2.原型的使用(p ...

  4. JS中常见的几种继承方法

    1.原型链继承 // 1.原型链继承 /* 缺点:所有属性被共享,而且不能传递参数 */ function Person(name,age){ this.name = name this.age = ...

  5. JavaScript面向对象继承方法

    JavaScript的出现已经将近20多年了,但是对这个预言的褒贬还是众说纷纭.很多人都说JavaScript不能算是面向对象的变成语言.但是JavaScript的类型非常松散,也没有编译器.这样一来 ...

  6. JS中的类,类的继承方法

    大牛请无视此篇! 首先我们定义一个类,方法很简单,就像我们定义函数一样,只不过我们为了与函数区分,名称首字母要大写,看代码: function Person (){ } 这就是一个很简单的Poson类 ...

  7. 《objective-c基础教程》学习笔记(五)—— 继承方法

    在上一篇博文中,我们将原先的纯C语言代码,编写成了用Objective-C(后面直接缩写成OC)的写法.使得代码在易读性上有明显提升,结构也更清晰.同时,也对面向对象的概念有了进一步的介绍和加深. 但 ...

  8. 设计模式之工厂方法(FactoryMethod)模式

    在五大设计原则的基础上经过GOF(四人组)的总结,得出了23种经典设计模式,其中分为三大类:创建型(5种).结构型(7种).行为型(11种).今天对创建型中的工厂方法(FactoryMethod)模式 ...

  9. Date类型之继承方法

    ECMAScript中的Date类型是在早期Java中的java.util.Date类型基础上构建的.为此,Date类型使用自UTC(国际协调时间)1970年1月1日午夜零时开始经过的毫秒数来保存日期 ...

随机推荐

  1. 基于OpenGL编写一个简易的2D渲染框架-11 重构渲染器-Renderer

    假如要渲染一个纯色矩形在窗口上,应该怎么做? 先确定顶点的格式,一个顶点应该包含位置信息 vec3 以及颜色信息 vec4,所以顶点的结构体定义可以这样: struct Vertex { Vec3 p ...

  2. 脚本中 %~dp0

    cmd窗口中 for /? 查询参数含义 %~dp0, 将参数转换为磁盘路径+名字 例: 脚本中一行 %~dp0abc.exe (abc.exe位置c:\test\abc.exe) 展开后则为 c:\ ...

  3. Haskell语言学习笔记(69)Yesod

    Yesod Yesod 是一个使用 Haskell 语言的 Web 框架. 安装 Yesod 首先更新 Haskell Platform 到最新版 (Yesod 依赖的库非常多,版本不一致的话很容易安 ...

  4. ArcGIS案例学习笔记2_1

    ArcGIS案例学习笔记2_1 联系方式:谢老师,135_4855_4328,xiexiaokui#qq.com 时间:第二天上午 案例1:学校选址 内容:栅格数据分析 教程:pdf page=323 ...

  5. Springboot IDEA eclipse 打包

    在开发springboot项目中,我们会进行打包发布项目,springboot推荐以jar包方式发布,相对之下 jar运行的效率比起war项目快很多. 打包切记: 1.查看项目里面有没有其他的main ...

  6. CSS的浮动(float)

    问题:在练习过程中,发现div1浮动后,它下面的div被覆盖住了. 解决方案:清除该div1的浮动. 关于CSS的浮动 1.div是块级元素,独占一行 2.浮动可以理解为让某个div元素脱离标准流,漂 ...

  7. POJ1950----DFS

    Dessert Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 6193   Accepted: 2299 Descripti ...

  8. android mapView

    1.Because the Maps library is not a part of the standard Android library, you must declare it in the ...

  9. 【英宝通Unity4.0公开课学习 】(二)场景创建

    本讲共四节,貌似讲课老师的速度变快了,2倍速听不清了...调成了1.7倍...老师果然越来越熟练了啊! 而且最开始的萌妹纸也不再出现在视频里了,我当时还想着完全可以换成老师自己提问嘛! 不过有妹纸声音 ...

  10. yii创建与设置默认控制器并载入模板

    yii创建与设置默认控制器并载入模板 一.创建控制器 在protected下的controllers文件夹中创建自定义的控制器文件,比如: IndexController.php (文件名首字母大写) ...