2015-11-29 19 views
7
function funcObj() { } 
funcObj.prototype.greet = "hello"; 
console.log(funcObj.greet) // undefined ??? 
console.log(funcObj.prototype.greet) // hello 

var obj = new funcObj(); 
console.log(obj.greet); // hello 

Theo hiểu biết của tôi về nguyên mẫu. Nếu bạn truy cập vào một thành viên của một đối tượng nó sẽ nhận được nó từ đối tượng nguyên mẫu khi không có sẵn trong đối tượng đó.Nguyên mẫu đối tượng hàm

Câu hỏi của tôi là:

từ chức năng trong Javascript là những đối tượng tại sao funcObj.greet -> không xác định, nhưng obj.greet -> hello?

+0

Chỉ có hàm tạo hàm có thuộc tính '.prototype', được sử dụng khi bạn gọi chúng bằng' mới'. Tất cả các đối tượng đều có * prototype *, nhưng đây không phải là thuộc tính. – Bergi

Trả lời

2

Nguyên mẫu không gì khác ngoài một đối tượng mà từ đó các phiên bản kế thừa các thuộc tính.

Vì vậy, funcObj là phiên bản của một mẫu thử nghiệm khác (một trong số Function) mà từ đó nó đã kế thừa tất cả các thuộc tính. Ngoài ra, nó có cho chính nó một prototype mà bạn có thể ràng buộc bất cứ điều gì bạn muốn và nguyên mẫu sẽ được sử dụng khi bạn gọi nó để xây dựng trường hợp mới của funcObj (nghĩa là, khi bạn gọi nó cùng với new keywork, như new funcObj()).

Do đó, hoàn toàn bình thường là funcObj không có thành viên được gọi là greet, trong khi các trường hợp của nó có nó.

+0

do đó mọi đối tượng hàm chính nó là một cá thể từ hàm dựng hàm. vì vậy nếu tôi thêm thuộc tính của tôi vào Function.prototype nó sẽ được chia sẻ bởi tất cả các cá thể hàm, đúng không? – Vignesh

+0

Nhiều hơn hoặc ít hơn. Trên thực tế, phạm vi mà hàm bị ràng buộc khác, nó là tham chiếu * this * hiện tại. – skypjack

0

Vì hàm này là đối tượng khác so với đối tượng.

Đặt thuộc tính vào một đối tượng sẽ không ảnh hưởng đến bất kỳ đối tượng nào khác; thậm chí không có chức năng mà đối tượng hoặc nguyên mẫu đó là một thể hiện của.

0

Giống như class Foo không phải là chính nó cùng loại với new Foo, không có lý do gì cho Foo để có bất kỳ thuộc tính nào bạn gán cho Foo.prototype. Lý do là một chút khác nhau, nhưng xem xét nó trong một ngôn ngữ khác như java và nó rõ ràng rằng những gì bạn đang cố gắng làm chỉ là không nên làm việc:

class Foo { 
    public String bar = "analogous to Foo.prototype.bar which is a property of Foo instances"; 
} 

class Baz { 
    String thisMethodShouldAndWillFail() { 
     return Foo.bar; 
    } 
    String thisIsWhatShouldAndWillWork() { 
     return (new Foo()).bar; 
    } 
} 

Trong javascript, bạn cần sửa ý tưởng của bạn về những gì một nguyên mẫu và cách nó liên quan đến các đối tượng và các nhà xây dựng, hoặc bạn sẽ gặp phải các vấn đề liên tục. Một số foo có một nguyên mẫu, nhưng nguyên mẫu đó là không phải làfoo.prototype. Có không có thuộc tính của foo chính nó là nguyên mẫu của nó. Nguyên mẫu của foo được xác định bởi hàm tạo của nóFoo; nó có ý nghĩa hơn theo cách này bởi vì bạn có thể gán bất kỳ giá trị cũ cho foo.prototype sau khi nó được xây dựng, phá vỡ foo bằng cách biến nó thành một thể hiện của một lớp mà nó không được khởi tạo.

Nhà xây dựng Foo tương tự sẽ không có ý nghĩa gì nếu nó hoạt động như một thể hiện của lớp mà nó định nghĩa; nó đã không được initalized bởi chính nó, vì vậy nó có thể không an toàn được giả định rằng nó sẽ thực hiện các hành vi dành cho trường hợp của mình. Foo là một thể hiện của Function, có ý nghĩa bởi vì nó có thể được gọi. Do đó, mẫu thử nghiệm củaFooFunction.prototype, khôngFoo.prototype.

Mối quan hệ giữa foo và nguyên mẫu của thiết bị được thiết lập khi bạn gọi foo = new Foo.Vì nội dung của hàm tạo Foo được dự kiến ​​khởi tạo phiên bản, đây là thời điểm chỉ để cung cấp foo nguyên mẫu của nó hợp lý. Nguyên mẫu cung cấp một đối tượng các hành vi chung của nó, hàm tạo khởi tạo đối tượng để các hành vi này sẽ hoạt động như dự định. Nguyên mẫu được gán cho foo khi nó được xây dựng qua new Foo không có gì khác ngoài Foo.prototype; điều này được thực hiện trước khiFoo được thực thi để thuận tiện và đảm bảo rằng nó không thể bị sai lầm. Theo đó, không có cách nào để truy cập nguyên mẫu của foo mà không qua Foo một cách rõ ràng.

enter code here 
Các vấn đề liên quan