2010-08-10 36 views
7

Tôi có một số đối tượng, giả sử son, mà tôi muốn kế thừa từ một đối tượng khác father.Thêm nguyên mẫu vào một đối tượng theo ngữ nghĩa

Tất nhiên tôi có thể làm cho một hàm constructor cho cha, như

Father = function() { 
    this.firstProperty = someValue; 
    this.secondProperty = someOtherValue; 
} 

Và sau đó sử dụng

var son = new Father(); 
son.thirdProperty = yetAnotherValue; 

nhưng đây không phải là chính xác những gì tôi muốn. Kể từ khi son sẽ có nhiều thuộc tính, nó sẽ dễ đọc hơn khi con trai được khai báo là một đối tượng theo nghĩa đen. Nhưng sau đó tôi không biết làm thế nào để thiết lập protoype của nó.

Làm cái gì đó như

var father = { 
    firstProperty: someValue; 
    secondProperty: someOtherValue; 
}; 
var son = { 
    thirdProperty: yetAnotherValue 
}; 
son.constructor.prototype = father; 

sẽ không hoạt động, như chuỗi nguyên mẫu dường như được ẩn đi và không quan tâm đến sự thay đổi của constructor.prototype.

Tôi nghĩ rằng tôi có thể sử dụng __proto__ tài sản trong Firefox, như

var father = { 
    firstProperty: someValue; 
    secondProperty: someOtherValue; 
}; 
var son = { 
    thirdProperty: yetAnotherValue 
    __proto__: father 
}; 
son.constructor.prototype = father; 

nhưng, theo như tôi hiểu, đây không phải là một tính năng tiêu chuẩn của ngôn ngữ và nó là tốt hơn không sử dụng nó trực tiếp.

Có cách nào để chỉ định nguyên mẫu cho một đối tượng theo nghĩa đen không?

+0

http://stackoverflow.com/questions/1592384/adding-prototype-to-object-literal –

Trả lời

11

Bạn nói đúng, __proto__ được một tài sản phi tiêu chuẩn, và hai cách tiêu chuẩn duy nhất bạn phải thiết lập một đối tượng mới của [[Prototype]], bao gồm:

  • Qua việc sử dụng một constructor và new toán tử (như bạn đã đề cập).
  • Sử dụng phương pháp ECMAScript 5 Object.create.

Object.create không widely supported vẫn chưa (hoạt động trên IE9Pre3 +, Firefox 3.7Alpha +, Chrome 5+ Safari 5+, Rhino 1.7), nhưng tại một số điểm tất cả các triển khai sẽ phù hợp với spec ES5. Có thể lấy hai đối số, đối tượng đầu tiên là đối tượng sẽ được sử dụng làm [[Prototype]] của đối tượng mới và đối tượng thứ hai là đối tượng khác có thể mô tả thuộc tính riêng (trong cùng cấu trúc mà bạn sẽ sử dụng Object.defineProperties).

Ví dụ:

var father = { 
    firstProperty: 1, 
    secondProperty: 2 
}; 

var son = Object.create(father, { 
    thirdProperty: { 
    value: 'foo' 
    } 
}); 

father.isPrototypeOf(son); // true 
son.firstProperty; // 1 

Các son nội [[Prototype]] bất động sản sẽ tham khảo father, và nó sẽ chứa một tài sản giá trị tên thirdProperty.

+1

Câu trả lời của bạn xóa tất cả những nghi ngờ của tôi, nhưng thật đáng buồn cú pháp của Object.create (với giá trị "được thêm") thậm chí ít có thể đọc được. – Andrea

+1

Vâng, tại sao họ không thể tạo ra một hàm chỉ đơn giản chấp nhận một đối tượng theo nghĩa đen. Ý tôi là, hầu hết thời gian chúng tôi chỉ quan tâm đến khóa và giá trị, không phải siêu dữ liệu thuộc tính như làm cho nó chỉ đọc. –

-1

Chỉ định nguyên mẫu cho một đối tượng theo nghĩa đen là "rất nhỏ", vì bạn chủ yếu muốn mẫu thử trên các đối tượng mà bạn tạo bằng cú pháp hàm tạo (ví dụ: X mới). Không nói điều này là không thể ... nhưng nó lạ. Một mẫu tương tự được chứng minh rõ ràng (được sử dụng bởi jQuery, ví dụ), thay vào đó là xác định nguyên mẫu như một đối tượng theo nghĩa đen.Ví dụ:

var X = function() {}; 
X.prototype = { 
    protoFunc1: function() {}, 
    protoFunc2: function() {} 
}; 
2

Đó không chính xác jmar777. Nếu ví dụ bạn có

var X = function() {}; 
X.prototype = { 
    protoFunc1: function() { console.log('p1');}, 
    protoFunc2: function() { console.log('p2');} 
}; 

X.protoFunc1(); // is not a function 

Điều đó có nghĩa rằng những gì bạn đang thực hiện:

X.prototype = {} 

chỉ là tạo ra một đối tượng được gọi là nguyên mẫu. Không phải là nguyên mẫu thực tế. Để sử dụng nguyên mẫu, bạn phải sử dụng hàm dựng.

tuy nhiên nếu bạn sửa đổi nó để này (constructor method)

function X(){}; 
X.prototype.protoFunc1 = function() { 
    console.log('p1'); 
} 
X.prototype.protoFunc2 = function() { 
    console.log('p2'); 
} 

var x = new X(); 
x.protoFunc1(); //'p1' 

Nó sẽ làm việc.

Hoặc là đi phương pháp theo nghĩa đen của đối tượng mà không sử dụng nguyên mẫu hoặc sử dụng phương pháp contructor bằng nguyên mẫu.

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