1.构造函数中的属性和方法我们称为成员,成员可以添加
2.实例成员===构造函数内部通过this添加的成员 uname,age,sing 就是实例成员(实例成员只能通过实例化的对象来访问)
3.静态成员 ==== 在构造函数本身上添加的成员 (静态成员只能通过构造函数来访问)
构造函数的问题
构造函数方法很好用,但是存在浪费内存的问题
构造函数原型prototype,构造函数通过原型分配的函数是所有对象所共享的。
1.原型是什么?一个对象,我们称prototype为原型对象
2.原型作用?共享对象
3.一般我们的公共属性定义到构造函数里面,公共的方法我们放到原型对象身上
//构造函数中的属性和方法我们称为成员,成员可以添加
function Sttar(uname, age){
this.uname = uname;
this.age = age;
}
Sttar.prototype.sing = function(){
console.log('我会唱歌');
}
var xm = new Sttar('小明', 18);
var xh = new Sttar('小红', 16);
//实例成员===构造函数内部通过this添加的成员 uname,age,sing 就是实例成员
console.log(xm.uname);//实例成员只能通过实例化的对象来访问
//静态成员 ==== 在构造函数本身上添加的成员
Sttar.sex = '男';
console.log(Sttar.sex); //静态成员只能通过构造函数来访问
console.dir(Sttar);
xm.sing();
xh.sing();
console.log(xm);//每个对象身上都有一个_proto_属性指向构造函数的原型对象
console.log(xm.__proto__);
console.log(Sttar.prototype === xm.__proto__);
利用原型链扩展内置对象
console.log(Array.prototype);
Array.prototype.sum = function(){
var sum = 0;
for(var i = 0; i < this.length; i++){
sum += this[i];
}
return sum
}
var arr = [1,2,3];
console.log(Array.prototype);
console.log(arr.sum());
继承
ES6之前通过构造函数+原型对象模拟实现继承,称为组合继承
function fn(){
console.log('5225225');
console.log(this)
}
var ss = {
name:'ddd'
}
fn.call();
//fn.call(ss);
//子继承父的属性
function Dad(uname, age){
this.uname = uname;
this.age = age;
}
Dad.prototype.money = function(){
console.log(10000)
}
function Child(uname, age, score){
Dad.call(this, uname, age);
this.score = score;
}
Child.prototype = new Dad();
Child.prototype.constructor = Child;
Child.prototype.exam = function(){
console.log('考试');
}
var child = new Child('小明', 15, 80);
console.log(child);
console.log(Dad.prototype);
console.log(Child.prototype.constructor)