给定一个对象和属性名称,是否可以确定该属性是使用getter还是setter定义的,还是完全透明?如果该属性已经定义了getter/setter,我只想定义一个getter/setter。
我需要它在WebKit / Firefox中工作。
给定一个对象和属性名称,是否可以确定该属性是使用getter还是setter定义的,还是完全透明?如果该属性已经定义了getter/setter,我只想定义一个getter/setter。
我需要它在WebKit / Firefox中工作。
我想你在寻找getOwnPropertyDescriptor
方法?
lookupGetter
,否则不可能。https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/LookupGetter - GrahamgetOwnPropertyDescriptor
,但是我错过了它,因为它是在 Object
对象上的属性。虽然这似乎是更标准的方法,但我更喜欢直接在相关对象上调用函数的语法。 - devios1getOwnPropertyDescriptor
用于确定对象是否在 本地 定义了 getter/setter,而 __lookupGetter__
实际上会返回原型上定义的 getter。 - devios1您可以使用Object.getOwnPropertyDescriptor(obj, prop)
例如:
var obj = { first: 1 }
obj.__defineGetter__('second', function() { return 2; });
// get descriptors
var descriptor1 = Object.getOwnPropertyDescriptor(obj, 'first');
var descriptor2 = Object.getOwnPropertyDescriptor(obj, 'second');
// check if it's a getter
descriptor2.get
// returns function () { return 2; }
descriptor1.get
// returns undefined
您可以使用Object.getOwnPropertyDescriptor(obj, prop)。
function isGetter (obj, prop) {
return !!Object.getOwnPropertyDescriptor(obj, prop)['get']
}
使用方法:
obj = {
foo: 'foo',
get bar() { return 'bar' }
}
isGetter(obj, 'bar') // will return true
isGetter(obj, 'foo') // will return false
Object.defineProperty
的get
或set
方法的默认值将是 undefined,如果在描述符中未定义。这是识别的理想方式。
举个例子:
var User = {};
Object.defineProperty(User, 'name', {
get: function () {
return _name;
},
enumerable: true
});
Object.defineProperty(User, 'designation', {
get: function () {
return _designation;
},
set: function (val) {
_designation = val;
},
enumerable: true
});
var d = Object.getOwnPropertyDescriptor(User, 'name');
console.log(d.set == undefined);
找到适合您的JavaScript需求的示例对象模板:
var Man=function(n,a){
var name,age;
function getName(){
return this.name;
}
function getAge(){
return this.age;
}
function create(){
this.name=n;
this.age=a;
console.log('new object created');
}
function setAge(age){
this.age=age;
}
function setName(name){
this.name=name;
}
return{
name:n,
age:a,
getName:getName,
getAge:getAge,
setName:setName,
setAge:setAge
};
}
var m1=new Man('Chaiguy',30);
// To check if Property exist for an Object
console.log(m1.hasOwnProperty('name'));
// To get the name and age of the object
console.log(m1.getName()+' is '+m1.getAge()+' years old.');
__defineGetter__
和__defineSetter__
的真正 JavaScript getter 和 setter。 - devios1get type() { return "Box"; } } var box = new Box(); var desc = Object.getOwnPropertyDescriptor(box, "type"); console.log(desc); // undefined```
- Snowman