博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
5)Javascript设计模式:extends模式
阅读量:5116 次
发布时间:2019-06-13

本文共 2618 字,大约阅读时间需要 8 分钟。

简单的方式

function Person() {    this.name = 'person';}Person.prototype.say = function() {};function Child() {    this.name = 'child';}Child.prototype = new Person(); var child = new Child();

缺点:其实child并不需要person里面的name属性

借用构造函数

function Person() {    this.name = 'person';}Person.prototype.say = function() {};function Child() {     Person.call(this, arguments)}var child = new Child();

缺点:仅会复制父类对象的属性作为子类自身的属性, 仅仅是复制**

优点:可以获得父对象自身的真实副本,子类和父类没有关系,不会影响到父类**

借用构造函数是实现多继承

function CatWings() {     Cat.call(this, arguments)     Brid.call(this, arguments)}

借用构造函数和实现原型

function Person() {    this.name = 'person';}Person.prototype.say = function() {};function Child() {     Person.call(this, arguments)    // this.name = 'child'}Child.prototype = new Person()var child = new Child();delete child.name;// 可以看到访问:child.name的是prototype的

name属性被继承了2次

缺点:所有从Person继承的类,都是可以更改到Person的原型方法

临时构造函数

function inherit(Child, Parent) {    var F = function(){}    F.prototype = Parent.prototype;    Child.prototype = new F();    // Child.prototype.constructor = Child    // Child.superclass = Parent.prototype;}// 每次都要创建一个空的Fvar inherit = (function(){    var F = Function(){};    return function() {        F.prototype = Parent.prototype;        Child.prototype = new F();        // Child.prototype.constructor = Child        // Child.superclass = Parent.prototype;    }})();

Klass

var Klass = function (Parent, props) {    if(props == undefined && typeof Parent == 'object') {        props = Parent;        Parent = null;    }    Parent = Parent || {};    props = props || {};    var Child = function() {        if(Child.superclass.hasOwnProperty('__construct')) {            Child.superclass['__construct'].apply(this, arguments);        }        if(Child.prototype.hasOwnProperty('__construct')) {            Child.prototype['__construct'].apply(this, arguments);        }    };    var F = function() {};    F.prototype = Parent.prototype;    Child.prototype = new F();    Child.prototype.constructor = Child;    Child.superclass = Parent.prototype;    for(var i in props) {        if(props.hasOwnProperty(i)) {            Child.prototype[i] = props[i];        }    }    return Child;}function Animal() {}Animal.prototype.__construct = function(name) {    this.name = name};Animal.prototype.getName = function() {    return this.name;};var Dog = Klass(Animal, {    __construct: function(name, age) {        this.age = age;    },    run: function() {        console.log('My name is %s, I\'m %s years old ,  I\'m Running', this.getName(), this.age);    }});var dog = new Dog('xixi', 26)

转载于:https://www.cnblogs.com/human/p/5080654.html

你可能感兴趣的文章
解析数字签名的Substring结构
查看>>
数据库锁简析(转载)
查看>>
SQL语句小结
查看>>
20180726 (面向对象:接口类和抽象类 多态 封装)
查看>>
浏览器窗口可视区域大小
查看>>
js事件类型
查看>>
在Excel中制作金字塔条形图
查看>>
python数据分析实用小抄
查看>>
Numpy基础数据结构 python
查看>>
用IDLE调试python程序
查看>>
Java IO流 之 BufferedReader
查看>>
js判断input输入框为空时遇到的问题 弹窗后,光标没有定位到输入框,而是直接执行我的处理页面程序...
查看>>
BDI和CDI理论四个象限的概念特点及其运用
查看>>
Use XSLT in wix
查看>>
[转] Kmeans与Meanshift、EM算法的关系
查看>>
CVE-2010-2883Adobe Reader和Acrobat CoolType.dll栈缓冲区溢出漏洞分析
查看>>
学习笔记——矩阵(1) 02.15
查看>>
cross compile ZThread for ios && android
查看>>
lucene 类介绍
查看>>
phpstudy手动把mysql数据库从5.5.56升级到5.6.41
查看>>