Thừa kế

Hàm Object.create

Hàm Object.create(proto) tạo ra một đối tượng mới có thừa kế từ đối tượng proto. Pollyfill của hàm tương tự như sau:

1
2
3
4
5
Object.create = function (proto) {
  function F() {}
  F.prototype = proto;
  return new F();
}

Ngoài tham số proto, còn một tham số tùy chọn của hàm là propertiesObject. Tham số propertiesObject là đối tượng sẽ chứa các thuộc tính sẽ được copy vào đối tượng mới trả về. Tham số propertiesObject tương tự như tham số hàm Object.defineProperties().

Trong trường hợp protonull thì đối tượng trả về không thừa kế của đối tượng nào.

1
2
3
4
5
var o = Object.create({}); // đối tượng thông thường
o.toString(); // ok

var n = Object.create(null); // đối tượng thừa kế từ null
n.toString(); // báo lỗi

Thừa kế trong Javascripts

Chúng ta sử dụng hàm Object.create() để Dog.prototype thừa kế từ Animal.prototype. Sau đó thì giữ lại constructor của Dog.prototype chính là hàm Dog.
Ví dụ sau tạo class Dog thừa kế từ class Animal:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
function Animal(name) {
  this.name = name;
}
Animal.prototype.sayName = function() {
  return `Xin chào ${this.name}`;
}

function Dog(name, age) {
  Animal.call(this, name); // gọi constructor cha
  this.age = age;
}
// Dog thừa kế từ Animal nhưng vẫn giữ constructor
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;

var myPet = new Dog('Billy', 4);
console.log(myPet); // -> Dog {name: "Billy", age: 4}
console.log(myPet.sayName()); // -> Xin chào Billy

Chúng ta kiểm tra lại ví dụ trên về prototype và thừa kế:
myPet sẽ thừa kế từ Dog.prototypeDog.prototype thừa kế từ Animal.prototype.

1
2
3
4
5
6
console.log(myPet.__proto__ === Dog.prototype); // true
console.log(myPet.__proto__.__proto__ === Animal.prototype); // true

// kiểm tra bằng instanceof
console.log(myPet instanceof Dog); // true
console.log(myPet.__proto__ instanceof Animal); // true