Làm sao để có được tất cả các thuộc tính của một đối tượng sử dụng sự phản chiếu trong Javascript?Phản chiếu Javascript - nhận tất cả các thuộc tính của một đối tượng?
Trả lời
Vòng qua các đối tượng và tận dụng mọi quan trọng mà thuộc về nó và không phải là một hàm:
var properties = [];
for(var key in obj) {
if(obj.hasOwnProperty(key) && typeof obj[key] !== 'function') {
properties.push(key);
}
}
var point = { x:5, y:8 };
for(var name in point) {
// name contains the property name that you want
// point[name] contains the value
}
Trong trình duyệt hiện đại, để có được tất cả tên thuộc tính (không chỉ tính đếm được), bạn muốn sử dụng Object.getOwnPropertyNames
...
var props = Object.getOwnPropertyNames(my_object)
Nếu bạn không muốn tính đếm được, bạn muốn sử dụng Object.keys
...
var props = Object.keys(my_object)
JavaScript không có công cụ tích hợp, tốt cho sự phản chiếu (nội tâm), vì vậy bạn cần thực hiện thủ công.
Lúc đầu, đây là một quy tắc ứng một giải pháp
/**
* Display details about an object at run-time
* @param {[any]} target Any object
* @return Nothing, all information will be display
*/
const introspect = (target) => {
// get type of a target
const typeTarget = typeof target;
// variable for type attribute of the target
let typeAttr;
// for properties and methods of the target
let properties = [];
let methods = [];
// if target is array, keep names all enumerable properties, simple put - numbers of indexes
// otherwise set to null
const enumerableProperties = Array.isArray(target) ? Object.keys(target) : null;
// determination functions and properties of the target by a parent object
Object.getOwnPropertyNames(Object.getPrototypeOf(target)).forEach((name) => {
if (typeof target[name] === 'function') {
methods.push(name);
} else if (target.hasOwnProperty(name) && properties.indexOf(name) === -1) {
properties.push(name);
}
});
// determination other functions and properties of the target
// filter it, if a name already added or if it is an array - filter all values of the indexes
Object.getOwnPropertyNames(target).forEach((name) => {
if (enumerableProperties !== null && enumerableProperties.indexOf(name) !== -1) {
return;
}
if (typeof target[name] === 'function') {
methods.push(name);
} else if (target.hasOwnProperty(name) && properties.indexOf(name) === -1) {
properties.push(name);
}
});
// order properties and methods by name in reverse
properties = properties.reverse();
methods = methods.reverse();
// display an obtained information by groups
console.log(`${typeTarget}: "${target}"`);
console.log(`\n\tProperties: ${properties.length}\n\t------------------`);
for (let i = properties.length - 1; i >= 0; i -= 1) {
typeAttr = typeof target[properties[i]];
console.log(`\t\t${properties[i]} --> ${typeAttr}`);
}
console.log(`\n\tMethods: ${methods.length}\n\t------------------`);
for (let i = methods.length - 1; i >= 0; i -= 1) {
let args = functools.getFunctionParameters(target[methods[i]]);
args = args.join(', ');
console.log(`\t\t${methods[i]} (${args})`);
}
};
Kiểm tra chức năng này trên ví dụ thực tế.
Đối với built-in đối tượng Array
introspect(Array);
Kết quả:
function: "function Array() { [native code] }"
Properties: 5
------------------
length --> number
name --> string
arguments --> object
caller --> object
prototype --> object
Methods: 8
------------------
apply()
bind()
call()
toString()
constructor()
isArray()
from()
of()
Đối với mảng sản (thể hiện của đối tượng Array)
introspect([-10, '20', true, []]);
Kết quả:
object: "-10,20,true,"
Properties: 1
------------------
length --> number
Methods: 29
------------------
constructor()
toString()
toLocaleString()
join()
pop()
push()
reverse()
shift()
unshift()
slice()
splice()
sort()
filter()
forEach()
some()
every()
map()
indexOf()
lastIndexOf()
reduce()
reduceRight()
copyWithin()
find()
findIndex()
fill()
includes()
entries()
keys()
concat()
Còn đối tượng thực thì sao?
introspect({
aa: 1,
bb: true,
cc: [],
dd: {},
c: (z, a= 2) => {},
b: function(z = 1, a=2) {},
d: function(b, zzz) {},
});
Kết quả:
object: "[object Object]"
Properties: 4
------------------
aa --> number
bb --> boolean
cc --> object
dd --> object
Methods: 14
------------------
hasOwnProperty()
constructor()
toString()
toLocaleString()
valueOf()
isPrototypeOf()
propertyIsEnumerable()
__defineGetter__()
__lookupGetter__()
__defineSetter__()
__lookupSetter__()
c (z, a = 2)
b (z = 1, a = 2)
d (b, zzz)
Chức năng này cũng hoạt động tốt với các module tích hợp. Hãy nhìn vào mô-đun Toán học.
introspect(Math);
quả
object: "[object Math]"
Properties: 8
------------------
E --> number
LN10 --> number
LN2 --> number
LOG2E --> number
LOG10E --> number
PI --> number
SQRT1_2 --> number
SQRT2 --> number
Methods: 46
------------------
hasOwnProperty()
constructor()
toString()
toLocaleString()
valueOf()
isPrototypeOf()
propertyIsEnumerable()
__defineGetter__()
__lookupGetter__()
__defineSetter__()
__lookupSetter__()
acos()
asin()
atan()
ceil()
clz32()
floor()
fround()
imul()
max()
min()
round()
sqrt()
trunc()
random()
abs()
exp()
log()
atan2()
pow()
sign()
asinh()
acosh()
atanh()
hypot()
cbrt()
cos()
sin()
tan()
sinh()
cosh()
tanh()
log10()
log2()
log1p()
expm1()
Matter gì gây ô nhiễm trả lời đang thừa, hãy thử làm điều đó cho mình và xem kết quả
introspect(34.2313);
introspect(true);
introspect(Date);
introspect((new Date()));
introspect(String);
introspect('text');
Đối với mã đầy đủ, tôi cũng cho thấy chức năng "getFunctionParameters" (trong mô-đun "functools.js"), vì nó đã sử dụng nó.
/**
* Return array paraments of a function
* @param {[function]} func function
* @return {[array]} parammeters the functions
*
*/
const getFunctionParameters = (func) => {
if (typeof func !== 'function') {
throw new Error('A argument is not function.');
}
const args = func.toString().match(/\((.*)\)/)[1];
return args.split(',').map((arg) => {
if (arg.indexOf('=') === -1) return arg.trim();
return arg
.split('=')
.map(val => val.trim())
.join(' = ');
});
};
Ghi chú:
yếu thử nghiệm
Full mã ở đây https://github.com/setivolkylany/nodejs-utils
Tài nguyên tốt về nó đề http://www.2ality.com/2011/01/reflection-and-meta-programming-in.html
sử dụng các tính năng của ES6
- 1. Lớp phản chiếu để lấy tất cả các thuộc tính của bất kỳ đối tượng nào
- 2. Lặp lại tất cả các thuộc tính của một đối tượng trong javascript bằng Prototype?
- 3. C# nhận được TẤT CẢ các thuộc tính của một đối tượng
- 4. Thuộc tính đối tượng JavaScript có thể tham chiếu đến thuộc tính khác của cùng một đối tượng không?
- 5. Ember.js: Quan sát tất cả các thuộc tính đối tượng
- 6. Cắt tất cả các thuộc tính chuỗi
- 7. Bắt tất cả các thuộc tính (Bao gồm cả các thuộc tính ẩn) của 0 (Đối tượng gốc)
- 8. AppleScript: Lấy danh sách tất cả các thuộc tính của một đối tượng hoặc lớp
- 9. Phản ánh trên tất cả các thuộc tính của giao diện, bao gồm cả các thuộc tính được kế thừa?
- 10. Giám sát tất cả các thuộc tính đối tượng JavaScript (getters và setters ma thuật)
- 11. Javascript: Xóa thuộc tính cho tất cả các đối tượng trong mảng
- 12. Thuộc tính của đối tượng hàm Javascript
- 13. Chức năng của PHP để liệt kê tất cả các thuộc tính của đối tượng
- 14. Liệt kê tất cả các thuộc tính của đối tượng cửa sổ?
- 15. Đối với một đối tượng, tôi có thể nhận tất cả các lớp con của nó bằng cách sử dụng phản chiếu hoặc các cách khác không?
- 16. Sao chép các thuộc tính đối tượng: phản chiếu hoặc tuần tự hóa - nhanh hơn?
- 17. Nhận tên thuộc tính thông qua sự phản ánh của đối tượng COM
- 18. C#: Cách nhận tất cả các thuộc tính chuỗi công khai (cả nhận và đặt) của một loại
- 19. C# Sử dụng sự phản chiếu để nhận các thuộc tính của đối tượng chung (và các đối tượng lồng nhau)
- 20. C# Đặt đối tượng Giá trị thuộc tính DateTime thông qua sự phản chiếu
- 21. NUnit - Xác nhận để kiểm tra tất cả các thuộc tính đều bằng nhau không?
- 22. Lặp qua tất cả các thuộc tính của đối tượng php
- 23. Nhận tất cả các thuộc tính đã đánh dấu một thuộc tính nhất định
- 24. Trạng thái ghi nhật ký đối tượng. Nhận tất cả các giá trị thuộc tính của nó dưới dạng chuỗi
- 25. Làm cách nào để liệt kê tất cả các thuộc tính trong đối tượng và nhận giá trị của chúng?
- 26. Truy cập các thuộc tính của một mảng đối tượng
- 27. nhận được một mảng của tất cả các thuộc tính sản phẩm trong magento
- 28. jQuery nhận tất cả các thuộc tính HTML
- 29. truy cập thuộc tính đối tượng của một javascript mà không biết rằng tên thuộc tính
- 30. Cách nhanh chóng để tổng hợp một thuộc tính của tất cả các đối tượng trong một NSSet?
trùng lặp có thể xảy ra [Javascript phản ánh - generic toString] (http://stackoverflow.com/questions/8638979/javascript-reflection-generic-tostring) –
thể trùng lặp của [ Cho một đối tượng javascript tùy ý, làm cách nào tôi có thể tìm thấy các phương thức của nó?] (Http://stackoverflow.com/questions/3252406/given-an-arbitrary-javascript-object-how-can-i-find-its-methods) – hugomg
@Brian Roach tại sao thats một nhân đôi? nó không liên quan gì đến toString! – IAdapter