Javascript - 为什么这个循环?实例->(原型(prototype)属性->构造函数属性->函数对象->构造函数属性)

标签 javascript

我无法理解 javascript 的这种循环行为。

有人能告诉我为什么要这样设计吗? 这种行为有任何实际用例吗?

为什么这个循环? { 新创建的实例从构造函数对象的原型(prototype)属性继承属性。 构造函数的原型(prototype)属性是一个保持构造函数属性的对象。 constructor 属性等于构造函数对象。 构造函数对象再次保留原型(prototype)属性。

instance1---inhertis(keeps)-->func()的原型(prototype)属性-->保持构造函数属性-->函数对象func-->保持原型(prototype)属性

var func = function(){};
var construct = func.prototype.constructor;

console.log(construct === func); //true

var instance1 = new func();

更新:即使在我之间分配了其他东西,instanceof 总是返回 true。

var func1 = function(){};
func1.prototype.constructor = 1;

var instance1 = new func1();
console.log(instance1 instanceof func1); //true


var func2 = function(){};
func2.prototype.constructor = 0;

var instance2 = new func2();
console.log(instance2 instanceof func2); //true

很抱歉在 1 个问题中提出 2 个问题,但这两个问题可能是相关的。

最佳答案

当然它保留了实例。为什么不呢?如果你正在制作一只鸭子,它就是一只鸭子 - 它的 DNA 表明它是一只鸭子,无论你是将它涂成黑色还是教它成为一只鹅。

此外,在您的情况下,设置构造函数无效。当你执行 new func(或 new func(),它们是相同的)时,你会去获取函数的内部属性([[Construct]] 属性),然后不是 func.prototype.constructor

obj.constructor 是在每个对象上定义的,因为它是在每个“构造函数”上定义的:即 Object Number Function Date Boolean String 等等。每个原型(prototype)都有一个 constructor 属性:

Object.prototype.constructor === Object;
String.prototype.constructor === String;
//etc

每个都有指向自身的prototype.constructor

因为函数也可以表现得像构造函数,它们的 .prototype.constructor 属性也指向它们自己。 AFAIK,语言本身未使用它。

简洁的技术性答案? http://es5.github.com/#x11.8.6

//foo instanceof bar
Return the result of calling the [[HasInstance]] internal method of bar with argument foo.

(略有释义)

基本上,您是在问鸭妈妈:“请问女士,这是您的 child 吗?” child 在这件事上几乎没有发言权。

编辑:如评论中所述,更改原型(prototype)确实会影响 instanceof 结果。像上面一样,有直观的答案和技术的答案。

直观的答案很简单:原型(prototype)定义了对象。因此,改变原型(prototype)会改变 DNA - 你让鸭子变成鹅,不是通过教它成为鹅,而是通过找到它的 DNA 并将其变成鹅的 DNA。

技术性是看什么[[HasInstance]]做。 (other [[HasIntsance]] 称之为这个规范)规范非常枯燥和简洁,所以这里是用伪 javascript 编写的算法:

//assume Func is the function we're talking about
function HasInstance ( value ) {
    if ( IsntAnObject(value) ) {
        return false;
    }

    var proto = Func.prototype;

    if ( Type(proto) !== "Object" ) {
        return false;
    }

    while ( value !== null ) {
        value = value.prototype;
        if ( value === proto ) {
            return true;
        }
    }
    return false;
}

可以看出,通过更改原型(prototype),我们正在更改行为 - value 将是不同的值。

关于Javascript - 为什么这个循环?实例->(原型(prototype)属性->构造函数属性->函数对象->构造函数属性),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8285575/

相关文章:

javascript - 在 svg 中集中根节点

javascript - 类更改时的 CSS 过渡

javascript - 如何将(kml的路径)替换为变量?我正在使用 geoxml3

javascript - Google Map API 加载动态信息窗口

javascript - 你如何设置 Meteor.userId() 以在自动表单/简单模式中使用?

javascript - 动态创建贝塞尔曲线?

javascript - 通过单击按钮在元素内添加 div

javascript - Ionic 与谷歌分析

javascript - 如何将 JSON 对象字符串转换为 Javascript 数组

javascript - 使用 Node 配置模块进行配置