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 proto là null 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.prototype và Dog.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
|