Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/463.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 除非设置为“可写”,否则无法重写易于配置的函数值对象原型属性_Javascript_Oop_Inheritance_Prototype - Fatal编程技术网

Javascript 除非设置为“可写”,否则无法重写易于配置的函数值对象原型属性

Javascript 除非设置为“可写”,否则无法重写易于配置的函数值对象原型属性,javascript,oop,inheritance,prototype,Javascript,Oop,Inheritance,Prototype,在下面的代码中,我有两个属性: sharedProperty:它有一个原语类型作为值,并被设置为仅可配置 sharedMethodAsProperty:它有一个作为值的函数,并且也被设置为可配置 现在,在代码片段的末尾,我可以覆盖sharedProperty很好(它是readonly和configurable),但是对于sharedMethodAsProperty,我必须将其设置为writable,否则我会收到无法覆盖readonly属性的投诉。想法 (function () { 'use

在下面的代码中,我有两个属性:

  • sharedProperty
    :它有一个原语类型作为值,并被设置为仅可配置
  • sharedMethodAsProperty
    :它有一个作为值的函数,并且也被设置为可配置
现在,在代码片段的末尾,我可以覆盖
sharedProperty
很好(它是
readonly
configurable
),但是对于
sharedMethodAsProperty
,我必须将其设置为
writable
,否则我会收到无法覆盖
readonly
属性的投诉。想法

(function () {
'use strict';
var Person = function () {
  Object.defineProperties(Person.prototype, {
    "sharedProperty" : {
      value : 10,
      configurable: true
    },

    "sharedPropertyThroughAccessor" : {
      get : function() {
        return "shared property";
      },
      configurable: true
    },

    "sharedMethodAsProperty" : {
      value: function() {
      return "shared method as property";
      },
      configurable: true,
      // if we omit this true here, we can't override it below.
      //writable: true
    }
  });
};

Object.prototype.sharedMethod = function() {
  return "shared method";
};

var person1 = new Person("John", "Doe");
var man = Object.create(person1);

var sharedProperty = Object.getOwnPropertyDescriptor(Person.prototype, "sharedProperty").value;
Object.defineProperty(man, "sharedProperty", {
  value : 11 + sharedProperty,
  configurable: true
});

var sharedPropertyThroughAccessor = Object.getOwnPropertyDescriptor(Person.prototype, "sharedPropertyThroughAccessor");
// bind with man, else you'd get person1's properties
var sharedFn = sharedPropertyThroughAccessor.get.bind(man);
Object.defineProperty(man, "sharedPropertyThroughAccessor", {
  get : function() {
    return sharedFn() + " overridden";
  }
});

var sharedMethodFn = person1.sharedMethod.bind(man);
// can't do: man.prototype. That property only exists on functions.
man.sharedMethod = function() {
  return sharedMethodFn() + " overridden";
};

var sharedMethodAsProperty = Object.getOwnPropertyDescriptor(Person.prototype, "sharedMethodAsProperty");
var sharedMethodAsPropertyFn = sharedMethodAsProperty.value.bind(man);
man.sharedMethodAsProperty = function() {
  return sharedMethodAsPropertyFn() + " overridden";
};
}());

在fuyushimoya的帮助下,我意识到自己有多笨,为什么它不起作用

  • sharedProperty
    是为
    man
    对象重新定义的,它从未被赋予新的值,这就是为什么即使
    sharedProperty
    不可写,覆盖也可以工作的原因
  • sharedMethodAsProperty
    正在为
    man
    对象分配一个新值。正在创建一个新的
    函数
    ,并分配给它。赋值要求它是可写的。使用
    Object.defineProperty()
    重新定义它是有意义的,就像
    man
    对象如何重写
    sharedProperty
    一样

你不需要一个二传手吗?@olsen:不需要。如果我需要它,我也会抱怨。@deletedComment:Nope,console.log(sharedMethodAsProperty.value);这就是我对人类的作用。不需要,实际上无法执行.get和.set,因为它们没有设置。@Shoaibi代码段在哪里显示
sharedProperty
可写的?@fuyushimoya无处可写。它不是可写的,只是可配置的。我没有提到它是可写的,是吗?只有
sharedMethodAsProperty
需要是可写的