Object.defineproperty 如何作用到类上或者说构造函数上

Object.defineproperty 如何作用到类上或者说构造函数上 。试了下好像只能作用的对象实例上

function Person(name,age) {
       this._name=name
       this._age=age
   }
    Person.prototype.say=function(){
        console.log(this._name)
    }
    let huixu = new Person('huixu',18)
    let lili = new Person('lili',25)
    
    Object.defineProperty(huixu,"_name",{value:'xxx'})//作用在对象实例上是有效的
    //Object.defineProperty(Person,"_name",{value:'xxx'}) 无效
    
    huixu.say()//huixu
    lili.say()//lili
阅读 2.7k
2 个回答
Object.defineProperty() 方法会直接在一个对象上定义一个新属性
function Person(name,age) {
       this._name=name
       this._age=age
   }
Object.defineProperty(Person,"_name",{value:'xxx'})
Person._name;   // xxx

这么定义属性是有效的,不管是上面说的构造函数,还是对象。但并不是定义在原型上,所以对应的实例对象无法继承。

如果直接在Person.prototype 原型上定义属性,就可以看到效果。

    Object.defineProperty(Person.prototype,"_name",{value:'xxx'})
    Person._name;   // undefined
    
    var obj = new Person('other',18)
    obj.say()   //xxx
    obj._name; // 'xxx' 
    

看了你修改后的问题,你给Person添加的属性不会被实例化的对象继承的,实例只会继承Person.prototype上的属性,建议再去好好理解原型和原型链

可以的啊

class Fun{}
Object.defineProperty(Fun, 'aa', {value: 'fdsfd'})
Fun.aa // "fdsfd"

也可以添加enumerable为true,让添加的属性可枚举,具体参考MDN

Object.defineProperty(Fun, 'aa', {value: 'fdsfd', enumerable: true})
Object.keys(Fun) // ["aa"]
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题