zoukankan      html  css  js  c++  java
  • 原型链

    原型对象

    JS原型对象初始化

    参考函数创建的简单步骤,如下:

    F = new NativeObject();
    
    //第一步:设置Class:function;
    F.[[Class]] = "Function"
    
    //第二步:函数对象的隐式prototype指向Function的显示原型, function的prototype也是一个对象, 是Object对象的实例, Object又是由Function构建出来的, 所以可以循环此步骤;
    F.[[Prototype]] = Function.prototype
    
    //第三步:初始化
    F.[[Call]] = <reference to function>
    F.[[Construct]] = internalConstructor
    
    //第四步:初始化当前执行上下文的作用域链
    F.[[Scope]] = activeContext.Scope
    
    // 如果函数通过new Function(...)来创建,那么
    F.[[Scope]] = globalContext.Scope
    
    //第五步:初始化传入参数的个数
    F.length = countParameters
    
    //第六步:F对象创建的原型
    __objectPrototype = new Object();
    __objectPrototype.constructor = F
    F.prototype = __objectPrototype
    
    return F

    什么是原型对象

    • 从上面可以看出, 每一个构造函数都有一个原型属性, 称为prototype, 它指向一个对象, 这个对象称为原型对象;

    • 默认所有原型对象自动获得constructor属性;constructor又引用了函数本身,所以也形成了JS中的构造函数和prototype的循环引用;

    原型对象的问题

    • 原型对象是由所有实例共享,对于包含引用类型值的属性来说,修改会影响到所有的实例;
    • 原型模式广泛应用于原生的引用类型如Object、Array、String等, 但不推荐在程序中修改原生对象的原型, 容易导致命名冲突;

    原型链

    一般的解释:

    • 所有对象都可以有原型,并且原型也是对象,所以接着它们也可以有原型,原型又可以有原型,如此就形成了所谓的原型链。当链条中的对象有一个值为null 的原型时,原型链终止。

    ECMA的解释:

    • Every object created by a constructor has an implicit reference (called the object’s prototype) to the value of its constructor’s “prototype” property. Furthermore, a prototype may have a non-null implicit reference to its prototype, and so on; this is called the prototype chain.

    看了如上中文解释,你肯定会困扰吧?是因为它只一味的提到原型; 而没有对隐式的原型 [[prototype]]和显示的prototype进行区分;

    所以你可能会认为, 按照第一种解释如下代码先寻找A.prototype, 发现A.prototype = null; 原型链终止,A.toString是不是会报undefined呢?

    //分析function A的原型链
    function A() {}
    
    A.prototype = null;
    
    A.toString();

    再看英文解释: Every object created by a constructor has an implicit reference (called the object’s prototype) to the value of its constructor’s “prototype” property;

    非常清晰:

    • 所有由构造器创建的对象都有一个隐式的prototype, 它指向构造器的prototype属性
    • 所以原型链其实是由当前对象的隐式prototype指针指向的对象的隐式prototype指针指向的对象的…., 直到隐式prototype指向的对象为空为至;有点饶;

    Object的prototype是null吗?

    解释一:Object 构造器的默认原型值为null;

    解释二:15.2.4 Properties of the Object Prototype Object

        The value of the [[Prototype]] internal property of the Object prototype object is null, the value of the [[Class]] internal property is “Object”, and the initial value of the [[Extensible]] internal property is true.

    解释一也存在和上面一样的问题,而英文的解释则非常明显:

    并非Object.prototype = null而是function Object中的隐式的prototypenull, 如下:

    function Object() {};
    var obj = new Object();
    obj.[[prototype]] = Object.prototype
    Object.prototype.[[prototype]] = null;

    示例

    看了上述的描述, 如果你完全理解了显示prototype和隐式prototype,我想你应该会很快n能画出如下对象的原型链了。试试看吧:

    示例1:请描述a对象的原型链

    var A = function() {};
    
    A.prototype = { b: 2, c: 3 };
    
    var a = new A();

    示例二:请描述b对象的原型链

    var A = function() {}
    
    A.prototype = { b: 2, c: 3 };
    
    var B = function() {}
    
    B.prototype = new A();
    
    var b = new B();
    

  • 相关阅读:
    2021年最后的每日一题练习 (持续更新)
    ColorPickUper类算出图片的主要色调
    js控制gif从第一帧开始播放的办法
    ExternalInterface.addCallBack 在TT浏览器 IETester等浏览器上的问题
    js版的矩形式图,算法借鉴datavjs
    Feathers ui给组件加个特定的皮肤
    linux笔记
    ofbiz调试
    ofbiz 笔记
    给gridview动态生成radiobutton添加OnCheckedChanged监听函数
  • 原文地址:https://www.cnblogs.com/mininice/p/3876309.html
Copyright © 2011-2022 走看看