构造函数中的属性和方法我们称为成员,成员可以添加
unction Star (uname, age) {
this.uname = uname
this.age = age
this.sing = function () {
console.log('我会唱歌');
}
}
var ldh = new Star('刘德华', 20)
console.log(ldh);
ldh.sing()
//在构造函数本身上添加的成员 静态成员
Star.sex = '男'
//静态成员只能通过构造函数来访问
console.log(Star.sex); //不能通过对象来访问
1.实例成员就是构造函数内部通过this添加的成员, uname age sing 就是实例成员。
实例成员只能通过实例化的对象来访问。即不能同构造函数来访问实例成员。
2.静态成员
在构造函数本身上添加的成员。
静态成员只能通过构造函数来访问,不能通过对象来访问。
构造函数的问题:
构造函数存在浪费内存的问题。 实例化新的对象时,需要不断地开辟新的内存空间。
构造函数原型prototype:
构造函数通过原型分配的函数是所有对象共享的。JavaScript规定,所有每一个构造函数都有一个prototype属性,指向另一个对象,这个prototype就是一个对象,这个对象的所有属性和方法,都会被构造函数所拥有。
我们可以把那些不变的方法,直接定义在prototype对象上,这样所有的对象实例就可以共享这些方法。
这里假如想要写多个方法的话,就把这些方法写成一个对象如下:
function Star (uname, age) {
this.uname = uname
this.age = age
// this.sing = function () {
// console.log('我会唱歌');
// }
// Star.prototype.sing = function () {
// console.log('我会唱歌');
// }
Star.prototype = {
sing: function () {
console.log('我会唱歌');
}
movie: function () {
console.log('我会演电影');
}
}
}
注意此种方法是包含有“=”的,这里“=”是赋值,就把原来的constructor属性给覆盖掉了,所以就没有办法指回我们的构造函数了 ,此时需要手动添加一个属性constructor : Star,
问:原型是什么?
一个对象,我们也称prototype为原型对象。
原型的作用是什么?
共享方法。
一般情况下,我们的公共属性定义到构造函数里面,公共的方法我们放到原型对象身上。
对象原型 __proto__
对象都会有一个属性__proto__指向构造函数的prototype原型对象,之所以我们对象可以使用构造函数prototype原型对象的属性和方法,就是因为对象有__proto__原型的存在。对象原型__proto__与原型对象是等价的。
对象身上系统自己添加一个__proto__ 指向我们构造函数的原型对象
方法的查找规则:首先先看ldh对象身上是否有sing方法,如果有就执行这个对象身上的sing 。
如果没有sing这个方法,因为有__proto__的存在,就去构造函数原型对象prototype身上去查找sing这个方法。
constructor构造函数
对象原型__proto__和构造函数prototype原型对象里面都有一个constructor属性,constructor我们称为构造函数,它指回构造函数本身。
constructor主要用于记录该对象引用于哪个构造函数,它可以让原型对象重新指向原来的构造函数。注意上边的情况,如果采用对象的形式创建多个方法,就没有了 constructor构造函数。此时需要手动添加一个属性constructor : Star, 指回我们的构造函数, 这样我们的constructor又可以指回我们的构造函数。
构造函数、实例、原型对象三者之间的关系: