zoukankan      html  css  js  c++  java
  • 关于对象的原型链

    画的构造器图
    从下往上看。如第一个new func().constructor=function func(){};func.consctrctor=funtion Function(){};Function.constructor=Function.prototype.constructor=Function

    画的原型链图
    从上往下看。如Object.__proto__=Function.prototype;Function.prototype.__proto__=Object.prototype;Object.prototype.__proto__=null;
    从下面的图我发现,prototype和__proto__配合的相当完美。从关系上说继承的链条是__proto__而不是prototype,因为他一直在追溯__proto__.
    但是__proto__的值是prototype提供的。

    -

    -

    -

    这里有winter大神的几个问题。可以用上图来解答。http://www.cnblogs.com/winter-cn/archive/2009/05/16/1458390.html
    下面是我自己试验的一些其他的问题。可以直接在全复制到html中,把相关注释去掉,调试。

    -

    -

    -

    <!DOCTYPE html>

    <html>
    <head>
    <meta charset="utf-8"/>
    <style type="text/css"></style>
    </head>
    <body>
    <script type="text/javascript">

    //-----------------------------------------------创建对象的几种方式
    //1直接创建对象,一个接口创建很多对象,会产生大量重复代码
    //var obj1=new Object()
    //obj1.a="a"

    //2工厂模式创建对象,用函数来封装以特定接口创建对象的细节,解决了创建多个相似对象的问题,但不知道一个对象的类型
    //function createObj(a){var o={};o.name=a;o.say=function(){};return o}
    //obj1=createObj("a")


    //3构造函数.首字母大写
    function Class(a){this.a=a;this.say=function(){};}
    Class.prototype.mm=2
    var obj1=new Class()

     
    var obj2={}
    obj2.__proto__=Class.prototype
    Class.call(obj2)

    //------------------------------------------------------------new对象的原理

    /*
    new的原理
    new F
    0. 如果F不是Object或者没有实现[[Construct]],抛出TypeError
    1. O=a new native ECMAScript object.
    2. O.[[Class]] ="Object"
    3. 得到F.prototype指向的值,不是引用
    4. 如果3是object,O.[[Prototype]]=F.prototype
    5. 如果3不是object, O.[[Prototype]]=Object.prototype
    6. 执行F.[[Call]],this=O,提供传递的参数
    7. 如果6是Object,return 6
    8. Return 1.
    简单说来
    var obj={}
    obj.__proto__=F.prototype
    F.call(obj)
    */


    //-------------------------------------------------------什么是instanceof

    //alert(obj1 instanceof Function) //false
    //alert(obj1 instanceof Object) //true
    //alert(obj1 instanceof null) //错误
    //obj1.__proto__=Class.prototype,obj1.__proto__.__proto__=Object.prototype,找到了Object,所以true
    //obj1.__proto__.__proto__.__proto__=null.因为null不是对象,所以这里错误了
    //alert(obj2 instanceof Class) //true   
    //这里已经设置了obj2.__proto__=Class.prototype

    //以上可见 A instanceof B只是判断A的__proto__链里是否有B的prototype
    //alert(Object instanceof Object); // true  Object.__proto__.__proto__===Object.prototype
    //alert(Function instanceof Object);// true    Function.__proto__.__proto__===Object.prototype
    //alert(Object instanceof Function);// true    Object.__proto__===Function.prototype
    //alert(Function instanceof Function);// true   Function.__proto__===Function.prototype
    //alert(Object.prototype instanceof Function);//false  Object.prototype.__proto__===null
    //alert(Function.prototype instanceof Object);//true  Function.prototype.__proto__===Object.prototype

    //---------------
    //function foo(){}; 
    //alert(foo instanceof Function); // true  foo.__proto__===Function.prototype 
    //alert(foo instanceof Object); // true    foo.__proto__.__proto__===Object.prototype
    //alert(new foo() instanceof Function); //false   new foo().__proto__===foo.prototype
    //alert(new foo() instanceof Object);  //true    new foo().__proto__.__proto__===Object.prototype




    //------------------------------------------------------------------什么prototype
    //alert(Function.prototype)   //function(){}
    //alert(Function.prototype.__proto__===Object.prototype)  //true
    //alert(Function.__proto__===Function.prototype)  //true
    //alert(Object.prototype)    //object Object
    //alert(Object.prototype.__proto__)    //null
    /*
    prototype是什么?
    prototype就是new Object。一个对象_obj。这个_obj有一系列的属性
    js中对象最终追溯到,Object.prototype对象_obj
    在这个_obj对象上已经定义了一系列的属性,如toString(),这就好像我们在构造函数的prototype中定义属性一样。而_obj这个对象的原型定义为null,至此到底
    */

    //---------------------------------------------------什么是typeof

    /*

    typeof A
    1. 解析A
    2. 如果1不是引用,转到4
    3. 如果GetBase(Result(1)) 是空,返回 "undefined".
    4. 调用GetValue(Result(1)).
    5. 根据以下情况返回
    Undefined   "undefined"
    Null    "object"
    Boolean   "boolean"
    Number   "number"
    String   "string"
    Object (没有[[Call]])  "object"
    Object (有 [[Call]])   "function"
    Object (宿主)     根据解释器来

    */
    //alert(typeof Function)
    //alert(typeof Object)  //typeof构造器==Function.因为构造器实现了[[call]].

    //alert(typeof Object.prototype)  //prototype是一个对象
    //alert(typeof Object.prototype.constructor)  //Object的constructor是Function

    //null不是对象,这里却把它作为对象了!这个要注意了

    //--------------------------------------------------------------判断对象类型的方法
    //Object.prototype.toString.call(...)

    //Function是什么?
    //alert(Object.prototype.toString.call(Function))  //函数对象



    //------------------------------------------构造函数的prototype和__proto__有什么关系?
    /*
    1对象通过__proto__来查找原型,__proto__指向构造函数的prototype.

    2构造函数既有__proto__,又有prototype,这两个没有关联,__proto__是指构造函数这个对象的原型,是Function.prototype.
    */
    function ff(){}
    ff.prototype.a=1
    ob1=new ff()

    //alert(ob1.__proto__===ff.prototype)  //true
    //alert(ff.__proto__===ff.prototype)  //false
    //alert(ff.__proto__===Function.prototype) //true

    //alert(ff.prototype===Function.prototype)  //false
    //alert(ff.prototype===Function.prototype)  //false
    //alert(ff.prototype.__proto__===Object.prototype) //true
    //ff.prototype=new Object()  //so that's it!



    //----------------------------------------------------构造函数(constructor)是什么?
    /*
    4.3.4 Constructor
    A constructor is a Function object that creates and initialises objects. Each constructor has an associated prototype object that is used to implement inheritance and shared properties.
    构造器就是一个函数对象,这个函数对象可以创建和初始化对象。每一个构造器都有相关的prototype对象,这个prototype对象是用来实现继承和共享属性的。
    */


    //-----------------------------------------------------------什么是constructor属性?

    /*
    constructor属性是什么?
    //alert(ff.constructor.constructor.constructor===ff.constructor)
    //alert(Object.constructor===Object.constructor.constructor)
    //alert(ff.constructor===ff)
    为什么(Function.constructor===Object.constructor)   //?
    为什么(Function.constructor===Function.constructor.constructor)   //?
    什么是Function,什么是Object?
    函数,他们都是函数。既然如此,也就转换成函数对象的constructor。
    那Function.constructor=?

    function _construct(){}
    _construct.prototype.a=1
    ob1=new _construct()
    alert(ob1.a)   
    ob1.constructor.prototype.a=2
    alert(ob1.a)
    说明 ------constructor是一个属性名,是一个引用
    */

    //alert(Object.prototype.constructor===Object)
    //alert(Function.prototype.constructor===Function)
    //constructor是什么?这就是真正的constructor的地方。Function是function的constructor,Object是object的constructor。Function.constructor------>没有---->到原型中去找Function.__proto__.constructor=Function.
    //constructor只是一个属性。
    //对象.constructor=构造对象的构造函数的prototype.constructor
    //构造函数的prototype.constructor=构造函数自己

    //alert(obj1.hasOwnProperty("constructor"))  //false
    //alert(ff.hasOwnProperty("constructor"))    //false
    //alert(Function.hasOwnProperty("constructor"))  //false
    //alert(Object.hasOwnProperty("constructor"))  //false
    //alert(Function.prototype.hasOwnProperty("constructor"))  //true
    //alert(Function.__proto__.hasOwnProperty("constructor"))  //true
    //alert(obj1.__proto__.hasOwnProperty("constructor"))  //true
    //alert(ff.prototype.hasOwnProperty("constructor"))  //true
    //constructor只是一个属性,是人工赋的一个属性而已。

    //alert(Function) //function Function(){}
    //alert(Function.constructor===Object.constructor) //true
    //alert(Object.constructor)  //function Function(){...}
    //alert(Date.constructor)   //function Function(){...}
    //以上都是函数实例.constructor=Function.prototype.constructor=Function

    //alert(Object.constructor); // function Function(){ [native code] } 
    //alert(Function.constructor); // function Function(){ [native code] } 

    //构造器函数的constructor是他自己
    //alert(Function.prototype.constructor===Function)
    //alert(ff.prototype.constructor===ff)
    //alert(Object.prototype.constructor===Object)  //true
    //alert(Date.prototype.constructor===Date)  //true
    //构造函数的constructor是自己,也就是说constructor的终点就是构造函数自己


    </script>
     </body>
    </html>

  • 相关阅读:
    The Google File System 中文版论文(上)(转载)
    百度技术沙龙(第1期) 2. 豆瓣数据存储实践(转载)
    YunTable开发日记(1) 计划 (转载)
    对SQL说不!NoSQL的数据库技术革命(转载)
    YunTable开发日记(8)聊聊分布式数据库的作用(转载)
    探索Google App Engine背后的奥秘(4) Google App Engine的架构(转载)
    企业中的NoSQL(转载)
    探寻关系数据库和ORM的最佳替代者(转载)
    探索Google App Engine背后的奥秘(3) Google App Engine的简介(转载)
    YunTable开发日记(2) – 前三天的总结 (转载)
  • 原文地址:https://www.cnblogs.com/lunalord/p/2017236.html
Copyright © 2011-2022 走看看