------------------------------
1.原型 (prototypr 原型属性)
2.继承
3.原型链
----------------------------------
prototypr 原型属性
constructor 构造函数
----------------------------------
prototypr 原型属性
为什么使用原型? 原型可以达到继承的目的
function Person(){
};
Person.prototype.name = 'shaozhu';
Person.prototype.age = 22;
Person.prototype.action = function(){
console.log(this.name);
}
var person1 = new Person();//实例化 可以享有里面的所有属性和方法
person1.name
Person {}
//我们如果打印出person1 看看会是什么
console.log(person1);
//发现有一个 __proto__ 没错 我们如果要取原型里面的东西 就要用这个来取值
原型的好处 相同的存在原型里面 不相同的把它独立出来
----------------------------------
例子 修改实例的属性 不影响其他实例的属性
function Person(){
};
Person.prototype.name = 'shaozhu';
Person.prototype.age = 22;
Person.prototype.action = function(){
consloe.log(this.name);
}
var person1 = new Person();
person1.name='ben';
var person2 = new Person();
person2.name;
"shaozhu"
----------------------------------
修改原型的属性后 所有的实例化的对象都会跟着修改
修改原型属性例子:
function Person(){
};
Person.prototype.name = 'sonia';
Person.prototype.age = 22;
Person.prototype.action = function(){
consloe.log(this.name);
}
var person1 = new Person();
person1.__proto__.name='ben';//修改原型
var person2 = new Person();
person2.name;
"ben"
注意:一个属性 如果原型定义了 实例也定义了 实例的 先从实例找 然后再从原型找
--------------------------------------------------------------------
检测 一个实例是否属于这个原型
function Person(){
};
Person.prototype.name = 'shaozhu';
Person.prototype.age = 22;
Person.prototype.action = function(){
consloe.log(this.name);
}
var person1 = new Person();
person1.__proto__.name='ben';//修改原型
var person2 = new Person();
Person.prototype.isPrototypeOf(person1)//检测 返回布尔
大型项目 原型封装用的比较的多
----------------------------------
构造函数和原型 混合使用
function Aa(name,age){
this.name = name;
this.age = age;
}
Aa.prototype.action = function(){//构造函数里面的一个方法 用原型声明 这个方法可以减少所占的资源 原型
return this.name;
}
var aa = new Aa("qqq",22);
var bb =new Aa("www",23);
console.log(aa.action());//调用
bb.action()
"www"
----------------------------------
例子:
function Aa(name,age,hobby){
this.name = name;
this.age = age;
this.hobby = hobby;
}
Aa.prototype.action = function(){//构造函数里面的一个方法 用原型声明 这个方法可以减少所占的资源
return "名字:"+this.name+",年龄:"+this.age+",爱好:"+this.hoboy;
}
var aa = new Aa("qqq",22,'写代码');
var bb =new Aa("www",23,'搭讪');
console.log(aa.action());
名字:qqq,年龄:22,爱好:写代码
console.log(bb.action());
名字:www,年龄:23,爱好:搭讪
----------------------------------
公共的可以放在原型里面 这个效果更高!!! 比如 action();
如果公共的不使用原型 多次的实例化之后 可能会出现内存的溢出!!
----------------------------------
继承 !!!!!
继承有两种:接口继承 实现继承(js 只支持这个!)
function Action(){};
Action.prototype.caDo = function(){
console.log('吃饭 睡觉');
}
function Ben(){};
Ben.prototype = new Action();//继承 全部都继承了
var aa = new Ben();//实例化 Ben
aa.caDo();
吃饭 睡觉
先从实例里面找 实例里面没有 然后到原型里面去找
----------------------------------
原型链 继承和继承之间产生的关系链
delete 不能删除继承的东西
person1.__proto__.name='ben';//修改原型
总结:原型里面放公用的 继承 可以提高效率