/*
函数有prototype属性,对象有_proto_属性。
ar obj = new Object();
// obj.a = 10;
//obj.b = 20;
function Object(){
this.a = 10;
this.run = function(){
alert(this.a);
}
}
console.log(obj);
VM2480:11 Object {a: 10}a: 10run: ()__proto__: Objectconstructor: Object()arguments: nullcaller: nulllength: 0name: "Object"prototype: Object__proto__: ()<function scope>__proto__: Object
原型的最大的优点也是他最大的缺点 那就是共享 没有独立性 和共享 是它的两个问题
//原型创建的缺点
function Box(){};
Box.prototype = {
constructor :Box,///强制指向实例 而不是指向object
name:'zhao',
age:100,
family:["哥哥",'姐姐'],
run:function(){
return this.name+this.age+'运行中';
}
}
var box1 = new Box(); //第一个缺点是不能传参 不好传参 不能通过传参来修改里面的属性
//如果在实例化一个box2 里面的name属性要改变 就弄不了
//我们可以通过构造函数和原型模式进行创建
function Box(name,age){ //保持独立的 用构造函数
this.name = name;
this.age = age;
this.family = ["哥哥",'姐姐'];
};
Box.prototype = {//可以共享的 用原型创建
constructor:Box,
run:function(){
return this.name+this.age+'运行中...';
}
}
var box1 = new Box('LEE',100);
var box2 = new Box('ffg',456);
box1.family.push('滴滴');//给box1加了一个文字 但是box2不会共享 因为没有使用原型的方式
//如果使用原型的方式 那就可以
alert(box1.run());
alert(box2.run());
alert(box1.family);
alert(box2.family);//引用类型没有使用原型,所以没有共享
//end
*/
//构造函数和原型看起来像两个快 为了解决这个问题 我们可以使用动态原型模式
//可以将原型封装到构造函数里面
function Box(name,age){
this.name = name;
this.age = age;
//alert('我是原型初始化'); 我是测试 原型初始化几次
this.family = ["哥哥",'姐姐'];
if(typeof this.run!='function'){//判断this.run是否存在 run是个方式 在对象里面就是个函数
//所以可以用等于函数的方式判断
Box.prototype.run = function(){
return this.name+this.age+'运行中...';
}
}
};
//原型的初始化,只要第一次初始化就可以了,没必要每次构造函数实例化的时候都初始化
var box1 = new Box('LEE',100); //每次构造函数实例化 就是new一个 都会初始化原型 就是函数
var box2 = new Box('ffg',456);
alert(box1.run());
alert(box2.run());
//还要记住一点 如果重新写这个原型 那么就会切断实例和新原型之间的联系
函数有prototype属性,对象有_proto_属性。
ar obj = new Object();
// obj.a = 10;
//obj.b = 20;
function Object(){
this.a = 10;
this.run = function(){
alert(this.a);
}
}
console.log(obj);
VM2480:11 Object {a: 10}a: 10run: ()__proto__: Objectconstructor: Object()arguments: nullcaller: nulllength: 0name: "Object"prototype: Object__proto__: ()<function scope>__proto__: Object
原型的最大的优点也是他最大的缺点 那就是共享 没有独立性 和共享 是它的两个问题
//原型创建的缺点
function Box(){};
Box.prototype = {
constructor :Box,///强制指向实例 而不是指向object
name:'zhao',
age:100,
family:["哥哥",'姐姐'],
run:function(){
return this.name+this.age+'运行中';
}
}
var box1 = new Box(); //第一个缺点是不能传参 不好传参 不能通过传参来修改里面的属性
//如果在实例化一个box2 里面的name属性要改变 就弄不了
//我们可以通过构造函数和原型模式进行创建
function Box(name,age){ //保持独立的 用构造函数
this.name = name;
this.age = age;
this.family = ["哥哥",'姐姐'];
};
Box.prototype = {//可以共享的 用原型创建
constructor:Box,
run:function(){
return this.name+this.age+'运行中...';
}
}
var box1 = new Box('LEE',100);
var box2 = new Box('ffg',456);
box1.family.push('滴滴');//给box1加了一个文字 但是box2不会共享 因为没有使用原型的方式
//如果使用原型的方式 那就可以
alert(box1.run());
alert(box2.run());
alert(box1.family);
alert(box2.family);//引用类型没有使用原型,所以没有共享
//end
*/
//构造函数和原型看起来像两个快 为了解决这个问题 我们可以使用动态原型模式
//可以将原型封装到构造函数里面
function Box(name,age){
this.name = name;
this.age = age;
//alert('我是原型初始化'); 我是测试 原型初始化几次
this.family = ["哥哥",'姐姐'];
if(typeof this.run!='function'){//判断this.run是否存在 run是个方式 在对象里面就是个函数
//所以可以用等于函数的方式判断
Box.prototype.run = function(){
return this.name+this.age+'运行中...';
}
}
};
//原型的初始化,只要第一次初始化就可以了,没必要每次构造函数实例化的时候都初始化
var box1 = new Box('LEE',100); //每次构造函数实例化 就是new一个 都会初始化原型 就是函数
var box2 = new Box('ffg',456);
alert(box1.run());
alert(box2.run());
//还要记住一点 如果重新写这个原型 那么就会切断实例和新原型之间的联系