Javascript 为什么对象的赋值不起作用?

Javascript 为什么对象的赋值不起作用?,javascript,object,prototype,Javascript,Object,Prototype,案例1:-最初在object literal中,我将_uproto_uuu分配给null,然后我尝试将其重新分配给animal,但这不起作用 “严格使用” 让动物={ 是的, 走{ 控制台。记录“动物行走”; } } 让兔子={ 答:是的, __原型:空 } 兔子。原生动物 console.logObject.getPrototypeOfrabbit 兔子。走路好吧,这有点棘手您的代码使用两种不同的_____;原意: 可以指定对象的初始原型的,以及 在对象创建后获取/设置它时 rabbit.\

案例1:-最初在object literal中,我将_uproto_uuu分配给null,然后我尝试将其重新分配给animal,但这不起作用

“严格使用” 让动物={ 是的, 走{ 控制台。记录“动物行走”; } } 让兔子={ 答:是的, __原型:空 } 兔子。原生动物 console.logObject.getPrototypeOfrabbit
兔子。走路好吧,这有点棘手您的代码使用两种不同的_____;原意:

可以指定对象的初始原型的,以及 在对象创建后获取/设置它时 rabbit.\uuuuu proto\uuuuu=animal不更改rabbit的原型的原因是,\uuuuu proto\uuuuuuu是Object.prototype定义的访问器属性。由于通过在对象文本中使用uuu proto uuu:null创建rabbit而没有任何原型,因此rabbit不会继承该访问器,因此rabbit。uuuu proto uu=animal只会在rabbit上创建一个名为uuu proto uuu的属性,而不是更改其原型


__proto__的这两种含义都是传统的web专用附件B兼容性。使用Object.create创建具有特定原型的对象Object.getPrototypeOf,如果无法避免更改对象的prototype Object.setPrototypeOf。浏览器之外的JavaScript引擎不需要实现附件B中的功能,如“proto”\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu您的代码使用两种不同的_____;原意:

可以指定对象的初始原型的,以及 在对象创建后获取/设置它时 rabbit.\uuuuu proto\uuuuu=animal不更改rabbit的原型的原因是,\uuuuu proto\uuuuuuu是Object.prototype定义的访问器属性。由于通过在对象文本中使用uuu proto uuu:null创建rabbit而没有任何原型,因此rabbit不会继承该访问器,因此rabbit。uuuu proto uu=animal只会在rabbit上创建一个名为uuu proto uuu的属性,而不是更改其原型

__proto__的这两种含义都是传统的web专用附件B兼容性。使用Object.create创建具有特定原型的对象Object.getPrototypeOf,如果无法避免更改对象的prototype Object.setPrototypeOf。浏览器之外的JavaScript引擎不需要实现附件B中的功能,如“proto”等,但根据我的经验,引擎不会在浏览器之外禁用大多数功能。

我认为,因为“proto”只能在构造函数属性中设置。你不能设定它。setter不能在构造函数之外工作。但是,setPrototypeOf是一个扩展的util函数,用于创建原型属性。 这里setPrototypeOf set protooverride(如果可用),否则它将使用原型创建新类

来自developer.mozilla.org

我认为,因为只能在构造函数属性中设置proto。你不能设定它。setter不能在构造函数之外工作。但是,setPrototypeOf是一个扩展的util函数,用于创建原型属性。 这里setPrototypeOf set protooverride(如果可用),否则它将使用原型创建新类

来自developer.mozilla.org


它不应该是动物而不是动物吗?@Theowkr naah,它确实很好用,我把兔子移走了。我需要将原型设置为动物而不是动物的prototype@TheoWckr-如果代码狂人想让动物,而不是它的原型,成为兔子的原型,那就不是了,因为动物会走路,但它的原型不会。它不应该是动物吗?@TheoWckr naah,当我移除兔子时,它确实工作得很好。我需要将原型设置为动物而不是动物的prototype@TheoWckr-如果代码狂人想让动物,而不是它的原型,成为兔子的原型,那就不是了,因为动物会走路,但它的原型不会。我想,因为原型只是在构造函数属性中。你不能设定它。是的,你可以。如果不从Object.prototype继承,或者不将_uproto_uu定义为访问器属性,则无法创建。在这里创建一个新类。但是请看mozila的定义,他们也没有创建我恐怕我不知道你的意思,但是我从阅读规范中对proto的管道有了深刻的理解。请参阅我的答案,了解OP代码中发生的事情。@xdeepakv,这里不是这样,T.J的答案很好地解释了我代码中发生的事情,无论如何,感谢您抽出时间,我很感激✌️ p、 美国:但我不是最悲观的选民:p@CodeManiac当前位置我也投了反对票你的问题:p.s回来;:P所以不用担心。继续编码!!我想,因为proto只在构造函数属性中。你不能设定它。是的,你可以。如果不从Object.prototype继承,或者不将_uproto_uu定义为访问器属性,则无法创建。E
lse在这里创建了一个新类。但是看到mozila的定义,他们也没有创建我恐怕不知道你的意思,但是我从阅读规范中对proto的管道有了深刻的理解。请参阅我的答案,了解OP代码中发生的事情。@xdeepakv,这里不是这样,T.J的答案很好地解释了我代码中发生的事情,无论如何,感谢您抽出时间,我很感激✌️ p、 美国:但我不是最悲观的选民:p@CodeManiac当前位置我也投了反对票你的问题:p.s回来;:P所以不用担心。继续编码!!__proto__属性也可以在对象文字定义中使用,以在创建时设置对象[[Prototype]],作为object.create的替代方法。请参阅:对象初始值设定项/文字语法。。我想知道@CodeManiac的这些台词-对,这是最重要的。它是附录B的一个特性,这意味着官方只允许web浏览器中的JavaScript引擎支持它,尽管根据我的经验,引擎不会禁用浏览器之外的大多数附录B特性。您正在成功地使用该功能创建rabbit,因此rabbit没有任何原型-这意味着它没有继承“proto”的其他含义,因此分配给“proto”没有任何特殊作用。如果propKey是字符串值“proto”,如果IsComputedPropertyKeyPropertyName为false,则让isProtoSetter为true。这不意味着我们正在这里设置原型吗?因此,如果我设置了uuu proto:animal,并移除了兔子。uuu proto\uuuu=null,代码工作正常,可以访问rabbit.walk。@CodeManiac-是的。正如我上面所说的:由于您通过在对象文本中使用_uproto_;:null来创建无任何原型的兔子。。。分配给_uproto_uuu later不起作用的原因是,创建后,rabbit不会继承Object.prototype,这是定义访问器属性的第二个含义,上面链接了。啊,这意味着如果我使用_uproto:null,它只会继承与Object.createnull相同的prototype,现在如果我做兔子,它只会创建一个新的键,而不会修改实际的原型。另一方面,如果设置它uuu proto uuuu:animal,它会将它添加到prototype中,而当我设置rabbit时,uuu proto uuu=null它会修改实际的prototype,对吗?uuuu proto uu属性也可以在对象文字定义中用于在创建时设置对象[[prototype]],作为object.create的替代。请参阅:对象初始值设定项/文字语法。。我想知道@CodeManiac的这些台词-对,这是最重要的。它是附录B的一个特性,这意味着官方只允许web浏览器中的JavaScript引擎支持它,尽管根据我的经验,引擎不会禁用浏览器之外的大多数附录B特性。您正在成功地使用该功能创建rabbit,因此rabbit没有任何原型-这意味着它没有继承“proto”的其他含义,因此分配给“proto”没有任何特殊作用。如果propKey是字符串值“proto”,如果IsComputedPropertyKeyPropertyName为false,则让isProtoSetter为true。这不意味着我们正在这里设置原型吗?因此,如果我设置了uuu proto:animal,并移除了兔子。uuu proto\uuuu=null,代码工作正常,可以访问rabbit.walk。@CodeManiac-是的。正如我上面所说的:由于您通过在对象文本中使用_uproto_;:null来创建无任何原型的兔子。。。分配给_uproto_uuu later不起作用的原因是,创建后,rabbit不会继承Object.prototype,这是定义访问器属性的第二个含义,上面链接了。啊,这意味着如果我使用_uproto:null,它只会继承与Object.createnull相同的prototype,现在如果我做兔子,它只会创建一个新的键,而不会修改实际的原型。另一方面,如果设置它,它会将它添加到原型中,当我做兔子时,它会修改实际的原型,对吗?
if (!Object.setPrototypeOf) {
    // Only works in Chrome and FireFox, does not work in IE:
     Object.prototype.setPrototypeOf = function(obj, proto) {
         if(obj.__proto__) {
             obj.__proto__ = proto;
             return obj;
         } else {
             // If you want to return prototype of Object.create(null):
             var Fn = function() {
                 for (var key in obj) {
                     Object.defineProperty(this, key, {
                         value: obj[key],
                     });
                 }
             };
             Fn.prototype = proto;
             return new Fn();
         }
     }
}