zoukankan      html  css  js  c++  java
  • JavaScript解密JavaScript原型链(转)

    代码:
    有一个制造class的工厂,它支持继承:
    var Class = function(parent)

        //
    因为classJavaScript里是保留字,所以用klass代替
        var klass = function() {
            this.init.apply(this, arguments);
        };
        
        //
    继承就是要改变这个Classprototype变量
        if (parent) {
            var subclass = function() {};
            subclass.prototype = parent.prototype;
            klass.prototype = new subclass;
            //
    所以此时klass.prototype.__proto__parent.prototype
        }

        klass.prototype.init = function() {};

        // shortcuts for Class
        klass.prototype.parent = klass;
        
        return klass;
    }

    //
    制造一个新类
    var Animal = new Class;

    //
    制造另一个类
    var Cat = new Class(Animal);

    var tom = new Cat;

    tom instanceof Cat // true
    tom instanceof Animal // true

    *********
    容易犯错的分割线 *********
    简单版:
    var Person = function() {};
    var clyde = new Person;

    之前没仔细看instanceof的定义,比如 clyde instanceof Person
    以为是clyde__proto__链里含有constructor === Person的话就等于true了。

    实际上,返回true的原因是Person.prototype === clyde.__proto__;

    ******************************************

    tom.__proto__ === Cat.prototype //
    就是subclass
    tom.__proto__.__proto__ = Animal.prototype //
    因为subclassAnimal的实例,subclass.__proto__就等于Animal.prototype

    *********
    感慨 *********

    JavaScript
    对类,继承的模仿真是难懂……总算搞明白了。就像Quara上那个问题说的那样,现有的JavaScript书,还有Douglas Crockford的那些slides都完全没有提到这样的知识点(好像他们觉得这不是问题似的……)。可是的确有信息被隐藏了,或者说不是那么清晰。怪不得我每次看到这部分都会头疼一下。

    总结:
    1.
    所谓原型链就是指对象上的__proto__链,而不是prototype
    2. Contructor(
    就是那些类函数,首字母大写的)在创建对象的时候会把自己的prototype赋值给对象的__proto__
    3. Constructor.prototype
    有一个默认的熟悉叫做constructor,指向Constructor自己,而且它是可以被篡改的 (比如Cat.prototype就没有constructor属性,它被完全替换成一个subclass实例了)
    4. instanceof
    是看右值的prototype是否在左值的原型链上(__proto__

    ES5
    已经提供了Object.isPrototypeOfObject.getPrototypeOf,所以别使用__proto__

    参考:
    JavaScript The Core
    (反复强烈推荐的啊)
    Quora: __proto__prototype的区别
    MDN: instanceof
    MDN: constructor

  • 相关阅读:
    2014第2周四部署环境&买火车票
    2014第2周三Web安全学习
    2014第2周二
    2014第2周一
    2013第一周日小结
    2013第1周六意外加班到很晚
    2014第一周五开发问题记URL传参乱码等
    XML文档形式&JAVA抽象类和接口的区别&拦截器过滤器区别
    通过WriteProcessMemory改写进程的内存
    【java】Windows7 下设置环境变量
  • 原文地址:https://www.cnblogs.com/syf/p/2709332.html
Copyright © 2011-2022 走看看