2011-12-21 39 views
26

Có thể, được đặt tên đối tượng và thuộc tính để xác định xem thuộc tính đó được xác định bằng cách sử dụng trình thu thập dữ liệu hoặc thiết lập hoặc hoàn toàn trong suốt không? Tôi chỉ muốn xác định một getter/setter nếu chưa có một định nghĩa trên thuộc tính.Xác định xem một thuộc tính JavaScript có định nghĩa getter hoặc setter không?

Tôi cần nó để làm việc trong WebKit/Firefox.

+0

như thế nào getter và setter phương pháp của bạn được xác định? ** getSomething ** và ** setSomething **? –

+2

Không, sử dụng các getters và setters JavaScript đúng với '__defineGetter__' và' __defineSetter__'. – devios1

Trả lời

30
+1

OK trong trường hợp đó tôi không nghĩ rằng nó có thể, trừ khi Safari cũng hỗ trợ 'lookupGetter' https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/LookupGetter – Graham

+0

Aha, nó! Xuất sắc! – devios1

+0

Cái xấu của tôi - trông giống như Safari * không * hỗ trợ 'getOwnPropertyDescriptor', nhưng tôi đã bỏ lỡ nó vì nó là một thuộc tính trên đối tượng' Object'. Nó dường như là cách tiêu chuẩn hơn để làm điều này, mặc dù tôi thích cú pháp gọi một hàm trên đối tượng trong câu hỏi chính nó. – devios1

23

Bạn có thể sử dụng Object.getOwnPropertyDescriptor(obj, prop)

Ví dụ:

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 
+3

Jim nhận được phiếu bầu của tôi để có nội dung mẫu. BOOM. – deepelement

+0

Lưu ý rằng nó có ** Thuộc tính riêng ** PropertyDescriptor, vì vậy nó sẽ không bao gồm các thuộc tính kế thừa hoặc các thuộc tính được định nghĩa trên nguyên mẫu. – gronostaj

0

Tìm mẫu template Object cho yêu cầu java Script của bạn:

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.'); 
0

Object.defineProperty'sget hoặc set giá trị mặc định Phương pháp sẽ không được xác định nếu n của nó ot được định nghĩa trong bộ mô tả. Đây là cách lý tưởng để xác định.

Hãy nói rằng ví dụ:

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); 

tham khảo: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

2

Bạn có thể sử dụng Object.getOwnPropertyDescriptor(obj, prop).

function isGetter (obj, prop) { 
    return !!Object.getOwnPropertyDescriptor(obj, prop)['get'] 
} 

Cách sử dụng:

obj = { 
    foo: 'foo', 
    get bar() { return 'bar' } 
} 

isGetter(obj, 'bar') // will return true 
isGetter(obj, 'foo') // will return false 
+0

Câu trả lời này là bản cập nhật của Jim Schubert câu trả lời vì ['__defineGetter__' không còn được dùng nữa] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/__defineGetter__) kể từ năm 2011. –

+2

Ý định ban đầu của tôi là chỉnh sửa câu trả lời của Jim để _ "thêm cập nhật dưới dạng bài đăng" _ như được đề cập trong [Trợ giúp ngăn xếp ngăn xếp> Tại sao mọi người có thể chỉnh sửa bài đăng của tôi? Chỉnh sửa hoạt động như thế nào?] (Https://stackoverflow.com/help/editing). Bản chỉnh sửa này đã bị từ chối vì lý do: _ “Bản chỉnh sửa này nhằm giải quyết tác giả của bài đăng và không có ý nghĩa như một bản chỉnh sửa. Nó phải được viết như một bình luận hay một câu trả lời. ”_. Vì vậy đó là lý do cho câu trả lời này. –

Các vấn đề liên quan