1.原型(prototype)
1)概念
在Javascript中,当系统加载构造函数后,会自动在内存中生成一个对象,这个对象就是原型对象。两者之间在内存中表现为相对独立,不存在谁包含谁的关系。但是两者之间又有一些关联,在构造函数的内部存在一个prototype属性指向原型对象,同时在原型对象的内存也存在一个属性constructor其指向了构造函数。简而言之,原型是function对象的一个属性,它定义了构造函数制造出的对象的公共祖先。通过该构造函数产生的对象,可以继承该原型的属性和方法。
2)作用
利用原型特点 提取共有属性
//Car.prototype.name= "BWM"; //把公有的属性放到原型里
//Car.prototype.width=1900;
//Car.prototype.height = 100;
//由于原型也是个对象,所以还能这么写,与上三句等同
Car.prototype = {
name : "BWM",
width : 1900,
height :100
}
function Car(owner,color){
this.owner = owner;
this.color = color;
}
var car= new Car("zhangsan","red");
var car2= new Car("lisi","black");
car.name;
car2.name;
3) 对象查看原型和构造器
function Person( ){
}
var p = new Person( );
var p = new Person( );
这句当运行到的时候会在Person里隐式写上var this = {prop:Person.prototype}, 即p. __ prop __ =Person.prototype
p
Person {}
__proto__:
constructor: ƒ Person( )
__proto__: Object
设置Person的原型的属性name
Person.prototype.name = "abc";
再在控制台输入p
p
Person {}
__proto__:
name: "abc" //Person.prototype.name
constructor: ƒ Person( ) //构造器
__proto__: Object
相当于__proto__ == Person.prototype
,是通过proto才找到Person.prototype的
2)手动修改构造器
function Car(){
}
var car = new Car( );
function Person(){
}
var person = new Person();
Person.prototype = {
constructor : car
}
Person.prototype.constructor //返回Car {}
2.原型链
1)原型链的形成
Grand.prototype.lastName="liming";
function Grand(){
this.money={ //方法里的对象都要用this
gold:1000
}
}
var grand = new Grand();
Farther.prototype = grand;
function Farther(){
this.name="xuming",
this.fortune={
card:'visa'
}
this.num=100
}
var farther = new Farther();
Son.prototype = farther;
function Son (){
this.hobbit = "smoke"
}
var son = new Son();
2)原型链的增删查改
子孙不能删掉、修改父(原型)的对象值等,但是可以增加父(原型
)对象集合里的属性值,
栗子1:
son.num++;
son
-->Son {hobbit: "smoke", num: 101}//把son.num引用取过来再+1
farther
-->Grand {name: "xuming", fortune: {…}, num: 100}//原型的num不变
例如以下 其实是先调用son.money这个引用 再给它增加属性,这不是一种赋值的修改,是一种调用的修改 是可以的
son.money.silver="2000"
son.money
-->{gold: 1000, silver: "2000"}//返回新增的属性
对它原型的原型grand来说,自己的对象及属性也变了
grand.money.gold
-->1000
如果改的是son.money = “5000”,那么就是给自己添加属性,不回去修改原型的