Object/Function/Array/String 原型链
注入一个奇怪的观念:
Function.prototype
独立于/先于Function
存在;Object.prototype
独立于/先于Object
存在
|
|
由上图我们可以看出原型链是 Object.prototype
–> Function.prototype
–> Object/Array/String/Function……
类和实例
在JS中,类实际就是一个函数。
对类进行实例化,采用关键字 new
,例子如下:
|
|
以上 Animal
是类,animal
是实例
输入:animal
输出:
- 定义一个函数的时候,js会自动给这个函数添加一个
prototype
的属性,值是空对象。 - 每一个JS对象都有一个
__proto__
属性,但prototype
属性只有函数才有。
我们将上面的代码画成图:
可以看出:
|
|
实例继承构造函数prototype的所有属性和方法。
我们可以通过实例去使用构造函数的属性和方法,如下:
|
|
- instanceof : 用于判断一个变量是否某个对象的实例 [instance:实例,例子]
this
和prototype
获取到的属性和方法,有什么区别?123456789function Animal(name) {this.name = name;}Animal.prototype.say = "hello"let dog = new Animal("dog")console.log(dog.name); // dogconsole.log(dog.say); // hello
同样是能获取到所继承的类的属性,但有一个弊端是当有多个对象继承该类时,只是用 `this` 的话,资源没办法共享,所以采用 `prototype` 资源的共享,当需要修改 `prototype` 中的某个属性或方法时,只需要 `Animal.prototype.say = "hi"`
参考
类和继承
类的继承可以用 call
和 apply
方法实现,它们的异同如下:
- 相同点:两个方法产生的作用是完全一样的,用于改变this指向
- 不同点:方法传递的参数不同