为什么需要原型
在js中万物皆对象,对象可以说是重中之重了。每一个对象都拥有自己的属性。但是在这个世界中有很多东西都是相似的,可以归为一类,他们有共同的方法和属性。不可能让每一个对象都定义一个属性吧。那样太消耗内存了。所以,在js中怎么才能让多个对象共享一个或多个方法呢?原型的出现就是为了解决这个问题。
什么是原型对象
声明一个构造函数
代码语言:javascript复制function students() {
/* 我就是构造函数 */
}
代码语言:javascript复制在声明了一个函数之后,浏览器会自动按照一定的规则创建一个对象,这个对象就叫做原型对象。这个原型对象其实是储存在了内存当中。函数有一个prototype属性(只有函数才有prototype属性),这是一个指针,指向一个包含所有实例共享的属性和方法的对象,称之为原型对象。原型对象有一个constructor属性,默认指向对应的构造函数。
什么是原型链
根据字面意思我们可以这样理解,就是将原型连成一条链。我们上面讲过,js每一次获取对象中的属性都是一次查询过程,如果在自有属性中找不到就会去原型对象中查找,如果原型对象中还查不到,就回去原型对象的原型中查找,也就是按照原型链查找,直到查找到原型链的顶端,也就是Object的原型。会一直通过__proto__向上查找,也就是它构造函数的prototype中查找,这就是原型链,通过__proto__向上进行查找,最终到null结束,如果没有则返回undefined。
在js中,对象都有__proto__属性,一般这个是被称为隐式的原型,该隐式原型指向构造该对象的构造函数的原型。
代码语言:javascript复制function Person (name, age) {
this.name = name
this.age = age
}
代码语言:javascript复制Person.prototype.sex = '女' // 构造函数原型上的属性
var p1 = new Person('zxx', 18)
console.log(p1.sex) // 女
console.log(Person.prototype)
代码语言:javascript复制console.log(p1)
当输出p1.sex时,p1会先查找其自身有没有sex属性,当没有找到时,就会沿着原型链查找,即p1.__proto__.sex
p1.__proto__ === Person.prototype // 实例对象的隐式原型就是其构造函数的显式原型
注意点:
- Object, Function, Array等等这些都被称作是构造“函数”,他们都是函数。而所有的函数都是构造函数Function的实例。从原型链机制的的角度来说,那就是说所有的函数都能通过原型链找到创建他们的Function构造函数的构造原型Function.protorype对象。
- 因为Function.prototype是一个对象,所以他的构造函数是Object。从原型链机制的的角度来说,那就是说所有的函数都能通过原型链找到创建他们的Object构造函数的构造原型Object.prototype对象
- Function是构造函数,所以它是函数对象
- 函数对象都是由Function构造函数创建而来的,原型链机制解释为:函数对象的原型链中存在Function.prototype
- 所有引用类型(函数,数组,对象)都拥有__proto__属性(隐式原型)
- 所有函数拥有prototype属性(显式原型)(仅限函数)
- 每个函数function都有一个prototype属性,默认指向一个空的Object对象(即称为:原型对象)函数的显示原型指向的对象默认是空Object实例对象(但Object不满足)
- 所有函数都是Function实例(包括Fuction本身)
- 对象的_proto_属性:创建对象时自动添加的,默认值为构造函数的prototype属性值
- 函数的所有实例对象自动拥有原型中的属性(方法)
- Object的原型对象是原型链尽头 Object.Prototype._proto_ // null
12.Storm实时数据分析平台
链接:https://pan.baidu.com/s/1A176hRxLB8lJvu_zMZQ0og
提取码:c28z