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
|