2015-01-11 11 views
8

Tôi là một người mới bắt đầu để Javascript và trên đường đến Nguyên mẫu trong JavaScript.
Theo bài viết hereisPrototypeOf trong Javascript

Tạo một Prototype
Cách thông thường để tạo ra một nguyên mẫu đối tượng là sử dụng một hàm xây dựng đối tượng:

function person(first, last, age, eyecolor) { 
    this.firstName = first; 
    this.lastName = last; 
    this.age = age; 
    this.eyeColor = eyecolor; 
} 

Với một hàm constructor, bạn có thể sử dụng từ khóa mới để tạo các đối tượng mới từ cùng một mẫu thử nghiệm:

var myFather = new person("John", "Doe", 50, "blue"); 
var myMother = new person("Sally", "Rally", 48, "green"); 

Chức năng hàm tạo là nguyên mẫu cho đối tượng người của bạn.
Tôi thấy mình bối rối ở dòng chữ đậm ở trên, điều mà tôi nghĩ là hoàn toàn sai.

Lý do:

alert(person.isPrototypeOf(myFather)); // false 

Tôi thích hợp để nói điều này vì tôi tin vào dòng này:

điểm Các 'nguyên mẫu' tài sản cho đối tượng đó sẽ được chỉ định là prototype của các cá thể được tạo bằng hàm đó khi sử dụng 'mới'.

+1

bạn không sử dụng nguyên mẫu ở tất cả như vậy trong trường hợp của bạn này nên là đúng, 'myFather instanceof person' – jcubic

+5

tôi 2cents http://www.w3fools.com/ – mfreitas

+0

Vâng, đó là dòng ** là ** hoàn toàn ** sai **. – Bergi

Trả lời

9

Tôi đồng ý rằng thuật ngữ không chính xác.

Chức năng constructor có một tài sản trong đó xác định các thuộc tính và phương pháp trong chuỗi ban đầu prototype; nhưng nó không phải là bản thân nguyên mẫu của một đối tượng, nó là nhà xây dựng.

isPrototypeOf không được kêu gọi các nhà xây dựng chính nó, nhưng về sở hữu nguyên mẫu của nhà xây dựng.

alert(person.prototype.isPrototypeOf(myFather)); // true 

myFather sẽ là một instanceofperson, và bạn có thể kiểm tra điều này bằng cách sử dụng dòng sau.

alert(myFather instanceof person); // true 
+2

cộng với một, isPrototypeOf không được gọi trên bản thân hàm tạo, nhưng trên thuộc tính nguyên mẫu của hàm tạo. Một dòng tốt đẹp mà bạn thêm vào đã giúp tôi. –

3

gì bạn đang nói,

điểm Các ‘nguyên mẫu’ tài sản cho đối tượng đó sẽ được chỉ định như nguyên mẫu của trường tạo ra với chức năng đó khi sử dụng ‘mới’.

Không hợp lý với tôi, nhưng tôi nghĩ bạn đã có ý tưởng đúng.

Với tôi, ít nhất,
Chức năng hàm tạo là nguyên mẫu cho đối tượng của bạn.
là sai.

Phiên bản đúng sẽ là:
Chức năng constructor là hàm constructor cho các đối tượng người bạn.


Thuộc tính mẫu của hàm tạo hàm là đối tượng.

Nó chứa các thuộc tính được gán cho đối tượng khởi tạo với chức năng xây dựng, ví dụ:

function Person(name){ 
    this.name = name; 
} 
Person.prototype = { 
    species: "Human" 
}; 

Sets lên một hàm constructor với một thuộc tính prototype, chứa một tài sản species.

Bây giờ, nếu chúng ta làm điều này:

var joe = new Person("Joe"); 

joe là một đối tượng trông giống như

{ 
    name: "Joe", 
    species: "Human" 
} 

Như bạn có thể thấy, các thuộc tính của nguyên mẫu của Person() được thiết lập như là thuộc tính bình thường của Joe.

TL; DR

Vì vậy, tôi nghĩ bạn có ý tưởng đúng.

+1

Không! Các thuộc tính trên nguyên mẫu được ** không ** "gán" cho các cá thể. 'joe' không có thuộc tính' riêng ', nó không giống như thế. – Bergi

+1

Tôi đồng ý với @Bergi, đối tượng 'joe' không giống như vậy. Nó sẽ trông như thế này: '{name: 'Joe'}' với thông báo thêm rằng sẽ có một thuộc tính __prototype__ trỏ đến đối tượng 'prototype'. – wmock

+0

@wmok no, hãy thử trong bảng điều khiển js của bạn. 'joe.species' tồn tại,' joe.prototype' thì không. – theonlygusti

3

Tôi đồng ý với bạn - câu "Chức năng của hàm tạo là nguyên mẫu cho đối tượng của bạn" gây nhầm lẫn và không chính xác. Thay vào đó, sự hiểu biết của bạn là chính xác mặc dù hãy để tôi giải thích thêm.

Về cơ bản, bất cứ khi nào bạn tạo một hàm trong JavaScript, nó sẽ tự động có một tài sản trên đó gọi là .prototype và giá trị liên kết với nó sẽ là một đối tượng. Trong trường hợp của bạn, hàm person cũng có thuộc tính .prototype này. Khi bạn tạo các trường hợp mới của person, mỗi trường hợp sẽ được thiết lập như kế thừa từ các đối tượng liên quan đến bất động sản .prototype các person chức năng của - nguyên mẫu của ví dụ. Thừa kế này có nghĩa là các tra cứu thuộc tính được giao cho đối tượng mẫu thử nghiệm này. Chìa khóa ở đây là khi các trường hợp person của bạn tìm kiếm một thuộc tính, trước tiên chúng sẽ tự tìm kiếm thuộc tính và nếu không tìm thấy thuộc tính, chúng sẽ đi lên chuỗi nguyên mẫu.

Nhìn vào ví dụ của bạn, đây là những gì là đúng:

person.prototype.isPrototypeOf(new person()); 

Nói cách khác, bất kỳ trường hợp người biết đến đại biểu đến đối tượng liên quan đến person.prototype bất cứ khi nào dụ không thể tìm thấy một tài sản trên chính nó.

+0

Cách bạn xây dựng nó nghe như thể chuỗi nguyên mẫu biết các nhà xây dựng và đã làm theo các thuộc tính '.prototype' của họ. Bạn có thể sửa cái này được không? – Bergi

+0

@Bergi không chắc chắn ý của bạn là gì - có lẽ nó chỉ là cách tôi đang nói một điều gì đó? Bạn có thể đề xuất bất cứ điều gì để cải thiện những gì tôi đã viết? – wmock

+0

Việc ủy ​​nhiệm thuộc tính không đi đến đối tượng được tham chiếu bởi thuộc tính 'person's' .prototype'. Có, nó là cùng một đối tượng, nhưng quá trình ủy nhiệm không biết về 'người' - chỉ là đối tượng nguyên mẫu mà nó thừa kế từ đó. Tôi đã cố gắng rephrase ansewer của bạn, xin vui lòng rollback khi bạn không thích nó. – Bergi