继承方法-->最终模式
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日午夜零时开始经过的毫秒数来保存日期 ...
随机推荐
- svn更新代码时控制台出现的英文字母表示什么意思
U:表示从服务器收到文件更新了 G:表示本地文件以及服务器文件都已经更新,而且成功的合并了 A:表示有文件或者目录添加到工作目录 R:表示文件或者目录被替换了 C:表示文件的本地修改和服务器修改发生冲 ...
- Json字符串转Dictionary
/// <summary> /// json字符串转Dictionary /// </summary> /// <param name="json"& ...
- python os.mkdir与 os.makedirs
1.mkdir( path [,mode] ) 作用:创建一个目录,可以是相对或者绝对路径,mode的默认模式是0777. 如果目录有多级,则创建最后一级.如果最后一级目录的上级目 ...
- 书单BookList
1. <代码大全> 史蒂夫·迈克康奈尔 (Code Complete) 2. <程序员修炼之道> Andrew Hunt [读过了,非常好的一本书] (Pragmatic Pr ...
- keras做DNN
输入的数据集是10000行,31645列,其中前31644是特征,最后一列是标签值.训练集和测试集格式是一样的. 特征值都是0,1形式,表示有还是没有这个特征,标签值是0,1形式,2分类. impor ...
- java jpa 报错
表的字段名不能是数据库的关键字 INSERT INTO `todo`.`todo_item` (description, completed) VALUES ('test 111', false); ...
- JS 相关
计算高度: var a = document.body.clientHeight/2;console.log(a) window.scrollTo(0, document.body.clientHei ...
- java中checked和unchecked 异常处理
有两种类型的异常:一种是checked异常一种是unchecked异常,在这篇文章中我们将利用实例来学习这两种异常,checked的异常和unchecked异常最大的区别就是checked去唱是在编译 ...
- 执行js,通过js显示隐藏的输入框,或者给input赋值
在测试过程中,有些输入框是隐藏的,如果直接对他进行赋值,会找不到这个输入框,从而导致脚本运行失败. 例如下面的这个密码输入框: 登录密码输入框分为两个input,下面的是提示的,上面的才是真正存下来的 ...
- Python format 格式化函数。
Python format 格式化函数 Python 字符串 Python2.6 开始,新增了一种格式化字符串的函数 str.format(),它增强了字符串格式化的功能. 基本语法是通过 {} 和 ...