2009-11-17 5 views

Trả lời

2

Có sự khác biệt ít nhất nếu bạn chỉ định đối tượng không nguyên thủy cho this.somevar hoặc prototype.somevar.

Thử chạy này:

function Agent(bIsSecret) 
{ 
    if(bIsSecret) 
     this.isSecret=true; 

    this.isActive = true; 
    this.isMale = false; 
    this.myArray = new Array(1,2,3); 
} 

function Agent2(bIsSecret) 
{ 
    if(bIsSecret) 
     this.isSecret = true; 
} 

Agent2.prototype.isActive = true;  
Agent2.prototype.isMale = true; 
Agent2.prototype.myArray = new Array(1,2,3); 

var agent_a = new Agent(); 
var agent_b = new Agent(); 

var agent2_a = new Agent2(); 
var agent2_b = new Agent2(); 

if (agent_a.myArray == agent_b.myArray) 
    alert('agent_a.myArray == agent_b.myArray'); 
else 
    alert('agent_a.myArray != agent_b.myArray'); 

if (agent2_a.myArray == agent2_b.myArray) 
    alert('agent2_a.myArray == agent2_b.myArray'); 
else 
    alert('agent2_a.myArray != agent2_b.myArray'); 
+0

Tôi đã thử: agent_a.myArray = agent_b.myArray' agent2_a.myArray == agent2_b.myArray Vì vậy, nó cho thấy rằng tại bằng cách sử dụng "này! "mỗi đối tượng có thuộc tính, chức năng riêng của nó. Nhưng khi tôi sử dụng nguyên mẫu, nó được chia sẻ. Đó có thể là một vấn đề bởi vì khi tôi thay đổi mảng trên một đối tượng, nó được thay đổi trên tất cả các đối tượng khác. :( – pencilCake

+0

yup, một cái gì đó tương tự;) – Lukman

1

số 'nguyên mẫu' được sử dụng để thực hiện quyền thừa kế trong Javascript. Chẳng hạn như là:

/** obsolete syntax **/ 

var Person = Class.create(); 
Person.prototype = { 
    initialize: function(name) { 
    this.name = name; 
    }, 
    say: function(message) { 
    return this.name + ': ' + message; 
    } 
}; 

var guy = new Person('Miro'); 
guy.say('hi'); 
// -> "Miro: hi" 

var Pirate = Class.create(); 
// inherit from Person class: 
Pirate.prototype = Object.extend(new Person(), { 
    // redefine the speak method 
    say: function(message) { 
    return this.name + ': ' + message + ', yarr!'; 
    } 
}); 

var john = new Pirate('Long John'); 
john.say('ahoy matey'); 
// -> "Long John: ahoy matey, yarr!" 

mã nguồn và các thông tin bổ sung mà bạn có thể tìm thấy ở đây: http://www.prototypejs.org/learn/class-inheritance

0

Về mặt chức năng, đây là như nhau. Cái thứ hai, tuy nhiên, nhấn mạnh sự giống nhau giữa các đối tượng Agent. Bạn có thể thấy trong một cái nhìn thoáng qua rằng những thành viên này có giá trị đó, trong khi trong một hàm xây dựng phức tạp hơn, với rất nhiều điều kiện, nó khó hơn.

Nó cũng cho phép thời gian chạy javascript để chọn cách xử lý Agent khởi tạo thành viên. (làm một số biên dịch trước, ...)

0

Giả sử rằng chức năng này được sử dụng như một hàm tạo, đầu tiên với các thuộc tính thiết lập trên thể hiện mới và thứ hai trên mẫu thử nghiệm. Nếu chúng độc lập với cá thể thì hai đoạn mã này là tương đương nhau, nhưng nếu chúng không giống như tên của chúng, thì chúng không phải.