• 继承


    什么是原型链

    ECMAScript中,每个由构造器创建的对象都拥有一个指向构造器prototype属性值的隐式引用,这个引用称为原型(prototype)。

    每个原型也可以拥有指向自己原型的隐式引用(即该原型的原型),如此下去,就是所谓的原型链(prototype chain),在具体的语言实现中,每个对象都有一个__proto__属性来实现对原型的隐式引用。

    理解了原型链,便可以实现继承。ECMAScript规定,当要给某个对象的属性赋值时,解释器会查找该对象原型链中第一个含有该属性的对象(原型本身就是一个对象,那么原型链即为一组对象的链。对象的原型链中的第一个对象是该对象本身)。如果要获取某个对象属性的值,解释器会返回该对象原型链中首先具有该属性的对象属性值。如图:

    原型链中的属性隐藏机制

    图中,object1、prototype1、prototype2构成了对象object1的原型链。因为在object1中已经找到了prototype4属性,所以prototype1的prototype4属性被隐藏。同理,在prototype1中找到了prototype3属性,所以prototype2中的prototype3属性也被隐藏。

    利用原型链实现继承
    //声明Animal对象构造器
    function Animal () {};
    //将Animal的prototype属性指向一个对象;
    //亦可以理解为指定Animal对象的原型
    Animal.prototype={
        name:"mengmeng",
        weight:200,
        eat:function(){
            alert("动物");
        }
    }
    //声明Mammal对象构造器
    function Mammal () {
        this.name = "哺乳动物";
    }
    //指定Mammal对象的原型为一个Animal对象。
    //实际上此处便是在创建Mammal对象和Animal对象之间的原型链
    Mammal.prototype = new Animal();
    //声明Horse对象构造器
    function Horse (height,weight) {
        this.name = "horse";
        this.height = height;
        this.weight = weight;
    }
    //将Horse对象的原型指定为一个Mammal对象,继续构建Horse与Mammal之间的原型链
    Horse.prototype = new Mammal();
    //重新指定eat方法,此方法将覆盖从Animal原型继承来的eat方法
    Horse.prototype.eat=function () {
        alert("马");
    }
    var horse = new Horse(100,300);
    horse.eat();//
    alert(horse.__proto__ == Horse.prototype);//true
    alert(horse.prototype.__proto__ == Mammal.prototype);//true
    alert(Mammal.prototype.__proto__ == Animal.prototype);//true

    参考文章:http://www.ibm.com/developerworks/cn/web/1304_zengyz_jsoo/

  • 相关阅读:
    Adobe CS6 系列软件通用破解补丁 (amtlib.dll 含32位与64位)
    vs2010 快捷键大全
    js 处理json时间格式
    绑定DropDownListFor
    js插件
    NHibernate资料收集
    常用正则
    jQuery里面的datepicker日期控件默认是显示英文的,如何显示中文或其他语言呢?
    ASP.NET中使用Fusion Charts(Access+SQL)图表工具
    asp.net 2.0揭秘读书笔记二:使用Rich控件
  • 原文地址:https://www.cnblogs.com/dragonwave/p/4740015.html
Copyright © 2020-2023  润新知