所有Javascript对象的通用getter/setter?

所有Javascript对象的通用getter/setter?,javascript,getter-setter,Javascript,Getter Setter,是否可以为所有Javascript对象定义通用的getter/setter 下面是我想做的伪代码。基本上,人和动物的路线获取者和设定者到客户获取者和客户设定者 function NewPerson() { var person; var animal; var person.name = 'John Doe'; console.log("Name: " + person.name); //Prints "Name: JOHNDOE CUSTOM" va

是否可以为所有Javascript对象定义通用的getter/setter

下面是我想做的伪代码。基本上,人和动物的路线获取者设定者客户获取者客户设定者

function NewPerson()
{
    var person;
    var animal;

    var person.name = 'John Doe';
    console.log("Name: " + person.name); //Prints "Name: JOHNDOE CUSTOM"

    var animal.type = 'Herbivore';
    console.log("Animal: " + animal.type); //Prints "Animal: HERBIVORE CUSTOM"

    console.log("Age: " + person.age); //Prints "Age: NON EXISTANT PROPERTY";
}

function CustomGetter(theObj, propertyName)
{
    if(theObj.hasproperty(propertyName))
        return ToUpperCase(theObj.propertyName);
    else
    {
        return "NON EXISTANT PROPERTY";
    }
}

function CustomSetter(theObj, propertyName, value)
{
    if(theObj.hasproperty(propertyName))
        theObj.propertyName = value + " CUSTOM";
    else
    {
        console.log("NON PROPERTY TO SET");
    }
}

谢谢大家!

您可以使用Object.defineProperty创建属性设置器或获取器:

从MDN文档中:

Object.defineProperty(obj, 'propertyName', {
  get: function() { return bValue; },
  set: function(newValue) { bValue = newValue; },
  enumerable: true,
  configurable: true
});

我最近刚做了类似的事情。如果在原型上定义了属性,则可以将其应用于所有实例。有点像这样:

   Object.defineProperty(Object.prototype, 'test', {
        get: function () {
            return "a test";
        }
    });

var test = new Array(2);
console.log(test); //a test

现在,任何对象都将具有“test”属性。

您应该使用代理陷阱来执行您想要的操作

文件:

您可以使用类和原型轻松地执行该操作,但我更愿意使用getter/setter陷阱将自定义处理程序转换为闭包

通常,它可以是这样的:

var Person = function(profile={})
{
    var required     = ["age", "name", "profession"];
    var buildProfile = function(p)
    {
        for(var prop of required)
        {
            if(!(prop in p))
                throw new ReferenceError
                ("⛔ Missing required property to profile '" +(prop+" in "+JSON.stringify(profile))+ "'");
        }
        return p;
    }(profile);

    var anotherPrivateFunc = function()
    {
        // ...
    };

    var publicMethods = 
    {
        status: function(prop, value)
        {
            // ...
        },
        isAdult: function()
        {
            return this.age >= 18;
        },
    };

    Object.assign(profile, publicMethods);
    return new Proxy(profile,
    {
        get: function(target, prop, receiver)
        {
            if(prop in target)
            {
                switch(prop)
                {
                    case "name":
                        return target[prop].toUpperCase(); break;
                }
            }
            return Reflect.get.apply(Object.getOwnPropertyDescriptor, arguments);
        }
    });
};


看看Object.defineProperty:对于对象,没有全面的setter/getter,您需要将对象包装在代理中才能获得该功能:谢谢。我看了一下,似乎代理更像是答案,而不是定义属性。使用代理,我甚至可以捕获不存在的属性。
var person = new Person({age:32, name: "Water", profession:"developper"})

person.name      // will return WATER
person.age       // --> 32
person.isAdult() // --> true

var person = new Person({age:32}) // will throw an cusotm error
Uncaught ReferenceError: ⛔ Missing required property to profile 'name in {"age":3}'