继承方法-->最终模式
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
继承方法-->最终模式的更多相关文章
- JavaScript 方法调用模式和函数调用模式
这两天在读<JavaScript语言精粹>关于第4章函数调用的几种模式琢磨了半天. 这里就说一下方法调用模式跟函数调用模式. 方法调用模式: 当一个函数被保存为对象的一个属性时,我们称它为 ...
- js继承的几种方法和es6继承方法
一.原型链继 1.基本思想 利用原型链来实现继承,超类的一个实例作为子类的原型 2.具体实现 function F() {} //原型属性,原型方法: ...
- javascript创建对象的方法--原型模式
javascript创建对象的方法--原型模式 一.总结 1.原型模式解决内存浪费的方法(继承):通过继承,对象继承原型模式下的所有属性,对象不同于其它对象的的属性自己创建或者修改 2.原型的使用(p ...
- JS中常见的几种继承方法
1.原型链继承 // 1.原型链继承 /* 缺点:所有属性被共享,而且不能传递参数 */ function Person(name,age){ this.name = name this.age = ...
- JavaScript面向对象继承方法
JavaScript的出现已经将近20多年了,但是对这个预言的褒贬还是众说纷纭.很多人都说JavaScript不能算是面向对象的变成语言.但是JavaScript的类型非常松散,也没有编译器.这样一来 ...
- JS中的类,类的继承方法
大牛请无视此篇! 首先我们定义一个类,方法很简单,就像我们定义函数一样,只不过我们为了与函数区分,名称首字母要大写,看代码: function Person (){ } 这就是一个很简单的Poson类 ...
- 《objective-c基础教程》学习笔记(五)—— 继承方法
在上一篇博文中,我们将原先的纯C语言代码,编写成了用Objective-C(后面直接缩写成OC)的写法.使得代码在易读性上有明显提升,结构也更清晰.同时,也对面向对象的概念有了进一步的介绍和加深. 但 ...
- 设计模式之工厂方法(FactoryMethod)模式
在五大设计原则的基础上经过GOF(四人组)的总结,得出了23种经典设计模式,其中分为三大类:创建型(5种).结构型(7种).行为型(11种).今天对创建型中的工厂方法(FactoryMethod)模式 ...
- Date类型之继承方法
ECMAScript中的Date类型是在早期Java中的java.util.Date类型基础上构建的.为此,Date类型使用自UTC(国际协调时间)1970年1月1日午夜零时开始经过的毫秒数来保存日期 ...
随机推荐
- ABAP-长文本处理
- UI5-文档-4.30-Debugging Tools
虽然我们在前面的步骤中添加了一个基本的测试覆盖率,但是我们似乎不小心破坏了我们的应用程序,因为它不再显示价格到我们的发票上.我们需要调试这个问题,并在有人发现之前修复它. 幸运的是,SAPUI5提供了 ...
- websocket使用
兼容性介绍 : https://caniuse.com/#search=websockets var websocket = null; //判断当前浏览器是否支持WebSocket if ('Web ...
- Haskell语言学习笔记(67)Gtk2Hs
Gtk2Hs $ brew cask install xquartz $ brew install glib cairo gtk gettext fontconfig freetype $ expor ...
- 如何将int整型转换成String字符串类型
自动类型转换适用于兼容类型之间从小范围到大范围数据的转换. nt转换成String int i = 10; int b=1: System.out.pritnln(a + b); 里面靠近字符串,所以 ...
- java heap space解决方法和JVM参数设置
在JVM中如果98%的时间是用于GC(Garbage Collection)且可用的 Heap size 不足2%的时候将抛出异常信息,java.lang.OutOfMemoryError: Java ...
- SQL时间格式化 转载备用~
Sel1 取值后格式化{0:d}小型:如2005-5-6{0:D}大型:如2005年5月6日{0:f}完整型 2 当前时间获取 DateTime.Now.ToShortDateString 3 取值中 ...
- 一种管理z-index属性的方案
原文在这里:http://www.smashingmagazine.com/2014/06/12/sassy-z-index-management-for-complex-layouts/ 核心思想是 ...
- MySql删除表、数据
程度从强到弱 1.drop table tb drop将表格直接删除,没有办法找回 2.truncate (table) tb 删除表中的所有数据,不能与where一起使用 ...
- vue2.0 element学习
1,bootstrap和vue2.0结合使用 vue文件搭建好后,引入jquery和bootstrap 我采用的方式为外部引用 在main.js内部直接导入 用vue-cli直接安装jquery和bo ...