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