当前位置: 首页 > 面试题库 >

Javascript可写描述符是否阻止实例更改?

邵祺
2023-03-14
问题内容

答案 (请在下面阅读,他们各自的作者提供了宝贵的见解):

  • “ writable:false”防止分配新值, 但是 Object.defineProperty不是分配操作,因此将忽略“ writable”的值
  • 属性属性是继承的,因此,在每个子类/实例上,一个属性将保持不可写状态,直到一个子类(或子类实例)将“可写”的值本身更改回true为止

问题

有关属性“可写”描述符的MDN文档指出:

writable当且仅当与属性关联的值可以使用赋值运算符更改时,才为true。默认为false。

官方ECMA-262第6版或多或少都声明相同。含义很清楚,但据我了解,它仅限于原始属性(即特定对象上的属性)

但是,请考虑以下示例(JSFiddle):

//works as expected, overloading complete       
var Parent = function() {};
Object.defineProperty(Parent.prototype, "answer", {
    value: function() { return 42; }
});

var Child = function() {};
Child.prototype = Object.create(Parent.prototype, {
    answer: {
        value: function() { return 0; }
    }
});

var test1 = new Parent();
console.log(test1.answer()); //42
var test2 = new Child();
console.log(test2.answer()); //0

//does not work as expected
var Parent2 = function() {};
Object.defineProperty(Parent2.prototype, "answer", {
    value: function() { return 42; }
});

var Child2 = function() {};
Child2.prototype = Object.create(Parent2.prototype);

test3 = new Parent2();
console.log(test3.answer()); //42
test4 = new Child2();
test4.answer = function() { return 0; };
console.log(test4.answer()); //42

在此示例之后,我们看到,尽管该属性不可写,但是可以像我期望的那样在子类(test2)的原型上重载该属性。

但是,当尝试在子类的实例(test4)上重载该方法时,它会静默失败。我希望它能像test2一样工作。尝试在Parent实例上重载属性时,也会发生同样的情况。

在NodeJS和JSFiddle中都会发生相同的事情,并且在某些情况下,实例的重载会引发有关该属性的只读性质的TypeError。

您能否向我确认这是预期的行为?如果是这样,解释是什么?


问题答案:

是的,这是预期的行为。

它无声地失败了。

不完全是。或:仅在草率模式下。如果您"use strict"使用,您会得到一个

Error { message: "Invalid assignment in strict mode", … }

在线上 test4.answer = function() { return 0; };

可以在子类(test2)的原型上重载它,但不能在子类(test4)的实例上重载

这与实例与原型无关。您没有注意到的是,您正在使用不同的方法来创建重载属性:

  • 对继承且不可写的属性的分配失败
  • 一个Object.defineProperty电话刚创建了一个新的属性,除非对象是不可扩展的

您可以对实例执行相同的操作:

Object.defineProperty(test4, "answer", {
    value: function() { return 42; }
});


 类似资料:
  • 问题内容: 我正在Linux C项目上工作,无法使用文件描述符。 我有一个孤立的文件描述符(文件是open()然后是unlink(),但是fd仍然很好),它具有只写权限。原始备份文件具有完全权限(使用S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH创建),但是可惜文件是用O_WRONLY打开的。是否可以复制文件描述符并将副本更改为O_RDWR? 伪代码: 提前致谢!-安德

  • Python 中,通过使用描述符,可以让程序员在引用一个对象属性时自定义要完成的工作。 本质上看,描述符就是一个类,只不过它定义了另一个类中属性的访问方式。换句话说,一个类可以将属性管理全权委托给描述符类。 描述符是 Python 中复杂属性访问的基础,它在内部被用于实现 property、方法、类方法、静态方法和 super 类型。 描述符类基于以下 3 个特殊方法,换句话说,这 3 个方法组成

  • 以下示例是注册两个 Servlet 上下文生命周期监听器和一个HttpSession 监听器的部署语法。 假设 com.acme.MyConnectionManager 和 com.acme.MyLoggingModule两个都实现了 javax.servlet.ServletContextListener,且com.acme.MyLoggingModule 又实现了javax.servlet.h

  • 问题内容: 我有一个用于编码URI的便捷类。在其中,根据需要的具体程度,我创建了三种方法。我想知道在这种情况下是否使用JavaDoc 重用描述?(我还没有找到) 问题答案: 否。复制适用于覆盖的方法,但不适用于重载的方法。http://java.sun.com/j2se/1.5.0/docs/tooldocs/solaris/javadoc.html#inheritingcomments

  • 问题内容: 什么是类描述符? 它是特定类的对象吗? 问题答案: 是的,对象是某个“类”的类描述符。 从API中: 此类的实例表示正在运行的Java应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组还属于一个反映为Class对象的类,该类对象由元素类型和维数相同的所有数组共享。原始Java类型(布尔型,字节型,字符型,短型,整型,长型,浮点型和双精度型)以及关键字void也都表示为对象。

  • 问题内容: 描述符对象需要存在于类中,而不是存在于实例中 因为那是实现的方式。 一个简单的例子。考虑一个描述符: 考虑每个obj具有多个Prop的情况:我将需要使用唯一的名称来标识值和乘数(如此处。具有每个实例的描述符对象将允许将(和)存储在描述符本身中,从而简化了几样东西。 我知道以前也曾提出过类似的问题,但我没有找到真正的解释: 为什么以这种方式设计Python? 建议使用哪种方式存储描述符需