Vì vậy, tôi có một isPlainObject
phương pháp đơn giản mà tôi sử dụng để kiểm tra cho literals đối tượng JavaScript:Tại sao việc thêm một thuộc tính vào nguyên mẫu của đối tượng theo nghĩa đen thay đổi "kiểu" của nó?
var isPlainObject = function (obj) {
return typeof obj === "object" && {}.toString.call(obj) === "[object Object]";
};
Bây giờ tôi có một đối tượng đơn giản:
var obj = {'one': 1, 'two': 2, 'three': 3};
Khi tôi chạy nó thông qua isPlainObject(obj)
chức năng nó hoạt động như mong đợi và trả về true
. Câu hỏi của tôi đến từ việc thêm một tài sản để nguyên mẫu của đối tượng:
obj.constructor.prototype.four = 4;
Bây giờ khi tôi chạy isPlainObject(obj)
trên obj
nó trả false
. typeof obj
trả về object
trong cả hai trường hợp. toString
trả về [object Number]
trong trường hợp thứ hai sau khi tôi đã thêm thuộc tính vào mẫu thử nghiệm.
Chính xác điều gì đã xảy ra để thay đổi obj
? Chuyện gì vậy?
CHỈNH SỬA: Điều này chỉ xảy ra khi được kiểm tra trong giới hạn của cuộc gọi chức năng QUnit.
test("each", function() {
_.each([1, 2, 3], function(i,v) {
equal(v, i + 1, 'each iterator provided index and value from array');
});
var obj = {'one': 1, 'two': 2, 'three': 3};
console.log(_.isPlainObject(obj)); // => true
obj.constructor.prototype.four = 4;
console.log(_.isPlainObject(obj)); // => false
});
EDIT: Đây là console.log tôi nhận được khi đăng nhập các đối tượng arguments
mảng giống như trong isPlainObject
.
Nhìn vào các bản ghi sẽ dường như chỉ ra mảng hiện có hai đối số. Nhưng độ dài vẫn còn đọc 1
.
Bạn đang sử dụng trình duyệt (lạ) nào? [Nó cho thấy 'true' đối với tôi ...?] (Http://jsfiddle.net/mattlunn/bR7PX/) – Matt
Tôi đang thử nghiệm trong một cuộc gọi thử nghiệm QUnit(). Và bạn nói đúng Tôi chỉ chạy thử nghiệm trong giao diện điều khiển và mọi thứ hoạt động như mong đợi. Tại sao chạy thử nghiệm này trong QUnit lại có hiệu ứng này. Một số loại vấn đề phạm vi? – Xaxis
Điều đó cũng đúng với tôi. 'Typeof obj' và' {} .toString.call (obj) 'trả về cho bạn là gì? – Barmar