2010-06-20 41 views
14

Làm cách nào để kế thừa với Object.create()? Tôi cố gắng này, nhưng không ai đang làm việc:Thừa kế JavaScript với Object.create()?

var B = function() {}; 
var A = function() {}; 
A = Object.create(B); 
A.prototype.C = function() {}; 

var B = function() {}; 
var A = function() {}; 
A.prototype.C = function() {}; 
A = Object.create(B); 

var B = function() {}; 
A = Object.create(B); 
var A = function() {}; 
A.prototype.C = function() {}; 

Không có gì làm việc. Làm thế nào tôi có thể sử dụng mới này Object.create() - chức năng?

+0

thể trùng lặp của [Sử dụng "Object.create" thay vì "mới"] (http://stackoverflow.com/questions/2709612/using-object-create-instead-of-new) – Bergi

Trả lời

21

Object.create() được sử dụng để kế thừa các đối tượng, chứ không phải các hàm tạo như bạn đang cố gắng thực hiện. Nó tạo ra một đối tượng mới với đối tượng cũ được đặt làm cha mẹ nguyên mẫu của nó.

var A = function() { }; 
A.prototype.x = 10; 
A.prototype.say = function() { alert(this.x) }; 

var a = new A(); 
a.say(); //alerts 10 

var b = Object.create(a); 
b.say(); //alerts 10 
b.x = 'hello'; 
b.say(); //alerts 'hello' 

Và chỉ để chắc chắn b không chỉ là một bản sao của một

a.x = 'goodbye'; 
delete b.x; 
b.say(); //alerts 'goodbye' 
+0

Chết tiệt, sau đó nó không phù hợp với tình hình của tôi. Tôi cần phải định nghĩa một "lớp" mở rộng một "lớp" khác. – Tower

+0

Điểm của sự thừa kế nguyên mẫu là bạn không có sự phân biệt cứng giữa "lớp" và "đối tượng" vì lớp là một đối tượng nữa. – Kos

+0

Tôi ước có 'Object.clone (obj)' sẽ tạo ra kết quả tương tự như 'JSON.parse (JSON.stringify (obj))'. – trusktr

0

Tài liệu gốc cho Douglas 'Object.create ở đây http://javascript.crockford.com/prototypal.html. Hãy chắc chắn rằng bạn đã bao gồm định nghĩa của phương thức

+0

.. không được khuyến nghị sử dụng triển khai đó, xem: http://stackoverflow.com/questions/5199126/javascript-object-create-not-working-in-firefox – zack

0

Bạn có thể xác định Object.create, nhưng nếu không phải là bản địa, bạn sẽ phải đối phó với nó được liệt kê trong mỗi vòng lặp mà bạn sử dụng cho các đối tượng .

Cho đến nay chỉ có webkits mới- Safari5 và Chrome hỗ trợ nó.

+3

'Object.create' là thuộc tính của' Object', không của 'Object.prototype', vì vậy việc tự định nghĩa nó sẽ không thêm nó vào danh sách các thuộc tính liệt kê trên tất cả các đối tượng. – kpozin

0

Bạn có thể tìm thấy thông tin hữu ích về JavaScript inheritance về Trung tâm Phát triển Mozilla.

16

Các mô hình tôi sử dụng cho điều này là để bọc từng loại trong một mô-đun, và phơi bày createprototype tài sản, như vậy:

var Vehicle = (function(){ 
     var exports = {}; 
     exports.prototype = {}; 
     exports.prototype.init = function() { 
       this.mph = 5; 
     }; 
     exports.prototype.go = function() { 
       console.log("Going " + this.mph.toString() + " mph."); 
     }; 

     exports.create = function() { 
       var ret = Object.create(exports.prototype); 
       ret.init(); 
       return ret; 
     }; 

     return exports; 
})(); 

Sau đó, tôi có thể xây dựng các loại có nguồn gốc như vậy:

var Car = (function() { 
     var exports = {}; 
     exports.prototype = Object.create(Vehicle.prototype); 
     exports.prototype.init = function() { 
       Vehicle.prototype.init.apply(this, arguments); 
       this.wheels = 4; 
     }; 

     exports.create = function() { 
       var ret = Object.create(exports.prototype); 
       ret.init(); 
       return ret; 
     }; 

     return exports; 

})(); 

với mẫu này, mỗi loại có chức năng create() riêng.

+0

Theo dõi: Những ngày này tôi sử dụng Coffeescript nếu tôi cảm thấy cần phải làm cho những thứ giống như lớp học, hoặc một đối tượng vô danh nếu tôi không. –

26

Có một số cách để làm thừa kế trong JavaScript

Xây dựng Thừa kế. Sử dụng nếu bạn không cần phải gọi constructor supertype:

function Rectangle(length, width) { 
    this.length = length; 
    this.width = width; 
} 

Rectangle.prototype.getArea = function() { 
    return this.length * this.width; 
}; 

// inherits from Rectangle 
function Square(size) { 
    this.length = size; 
    this.width = size; 
} 

Square.prototype = Object.create(Rectangle.prototype); 

var rect = new Rectangle(6, 8); 
var square = new Square(10); 

console.log(rect.getArea());    // 48 
console.log(square.getArea());    // 100 
console.log(rect instanceof Rectangle);  // true 
console.log(rect instanceof Object);  // true 
console.log(square instanceof Square);  // true 
console.log(square instanceof Rectangle); // true 
console.log(square instanceof Object);  // true 

Constructor Trộm cắp. Được sử dụng nếu cần gọi hàm khởi tạo supertype:

function Rectangle(length, width) { 
    this.length = length; 
    this.width = width; 
} 

Rectangle.prototype.getArea = function() { 
    return this.length * this.width; 
}; 

// inherits from Rectangle 
function Square(size) { 
    Rectangle.call(this, size, size); 
} 

Square.prototype = Object.create(Rectangle.prototype); 

var rect = new Rectangle(6, 8); 
var square = new Square(10); 

console.log(rect.getArea());    // 48 
console.log(square.getArea());    // 100 
console.log(rect instanceof Rectangle);  // true 
console.log(rect instanceof Object);  // true 
console.log(square instanceof Square);  // true 
console.log(square instanceof Rectangle); // true 
console.log(square instanceof Object);  // true 
+0

Tôi thấy Square.prototype.constructor = Square; ở đâu đó, nó không cần? – c0ming

0

Cũng đã muộn năm, nhưng đối với bất kỳ ai gặp trở ngại về điều này. Bạn có thể sử dụng Object.assign trong FF và Chrome.

Trong ví dụ này khi Cube đang được tạo bằng cách tạo. Object.create đầu tiên (this) tạo đối tượng với thuộc tính z, sau đó với Object.assign (obj, Square.create (x, y)) nó sẽ gọi Square.create và trả về và nối thêm vào Cube được lưu trữ trong obj .

var Square = { 
     x: 0, 
     y: 0, 

     create: function(x,y) { 
      var obj = Object.create(this); 
      obj.x = x; 
      obj.y = y; 
      return obj; 
     } 
    }; 

var Cube = { 

     z: 0, 

     create:function(x,y,z) { 
      var obj = Object.create(this); 
      Object.assign(obj, Square.create(x,y)); // assign(target,sources...) 
      obj.z = z; 
      return obj; 
     } 
    }; 

// Your code 
var MyCube = Cube.create(20,30,40); 
console.log(MyCube); 
Các vấn đề liên quan