JavaScript学习_1构造函数和原型
通过构造函数创建对象
function Person (name, age) {
this.name = name
this.age = age
this.sayName = function () {
console.log(this.name)
}
}
var p1 = new Person('Jack', 18)
var p2 = new Person('Jack', 16)
p1.sayName() // => Jack
问题:
1、通过new 创建出来的对象,里面的所有数据都是一个新的对象和空间,因此数据也无法共享。创建多了之后浪费空间。
解决:
通过原型来解决!
原型对象
每一个构造函数都有一个 prototype
属性,指向另一个对象。这个对象的所有属性和方法,都会被构造函数的实例继承。这也就意味着,我们可以把所有对象实例需要共享的属性和方法直接定义在 prototype
对象上。
function Person (name, age) {
this.name = name
this.age = age
}
console.log(Person.prototype)
Person.prototype.type = 'human'
Person.prototype.sayName = function () {
console.log(this.name)
}
var p1 = new Person(...)
var p2 = new Person(...)
console.log(p1.sayName === p2.sayName) // => true
注意:
-
任何函数都具有一个
prototype
属性,该属性是一个对象 -
构造函数的
prototype
对象默认都有一个constructor
属性,指向prototype
对象所在函数 -
通过构造函数得到的实例对象内部会包含一个指向构造函数的
prototype
对象的指针__proto__
-
所有实例都直接或间接继承了原型对象的成员
-
查找对象属性的时候,实例对象中没有的话会去原型对象中去找。
原型对象的使用
原型对象使用建议
-
私有成员(一般就是非函数成员)放到构造函数中
-
共享成员(一般就是函数)放到原型对象中
-
如果重置了
prototype
记得修正constructor
的指向
注意:
最好不要让实例之间互相共享这些数组或者对象成员,一旦修改的话会导致数据的走向很不明确而且难以维护。