原型,原型链,call/apply
定义:原型是function对象的一个属性,他定义了构造函数制造出的对象的公共祖先。通过该构造函数产生的对象,可以继承该原型的属性和方法。 原型也是对象。
利用原型特点和概念,可以提取共有属性。
对象如何查看原型à隐式属性_proto_
对象如何查看对象的构造函数àconstructor
//Person .prototype ---原型
//Person.prototype = {} 是祖先
Person.prototype.name = "haha";//祖先
function Person(){
}
var person = new Person();//继承祖先
Person.prototype.Lastname = "haha";
Person.prototype.say = function (){
console.log("hehe");
}
function Person(){
}
var person = new Person();
var person1 = new Person();
Person.prototype.Lastname = "haha";
Person.prototype.say = function (){
console.log("hehe");
}
function Person(){
this.Lastname = "ji";
}
var person = new Person();
var person1 = new Person();
自己身上有属性,原型上也有,可近的来。
Person.prototype.Lastname = "li";
Person.prototype.say = function (){
console.log("hehe");
}
function Person(name,age,sex){
this.name = name;
this.age = age;
this.sex = sex;
}
var person = new Person("ming",18,"male");
通过构造函数流程化生产,把这个对象生产出来了,生产出来之后这个对象有三个属性,对象有自己的属性,对象也有继承来的属性,访问自己的属性——person.name,访问他没有的属性——person.Lastname,相当于访问自己的属性一样。
function Car(color,owner){
this.owner = owner;
this.carName = "BMW";
this.height = 1400;
this.lang = 4900;
this.color = color;
}
var car = new Car('red',"prof.ji");
可以选配的我写到里面,可以流程化生产的我也写到里面,理论上看来没问题,但现在选配的这么来写没问题,里面这种流程化生产的(this.carName "BMW";this.height = 1400;this.lang = 4900;)每一次执行,都得执行这东西,这是不是叫代码的耦合啊,那咱能不能通过原型把它提取出来。
Car.prototype.height = 1400;
Car.prototype.lang = 4900;
Car.prototype.carName = "BMW"//给原型赋值的只执行了一遍
/*Person.prototype = {
height : 1400;
lang : 4900;
carName : "BMW";//更简化*/
}
function Car(color,owner){
this.owner = owner;
this.color = color;
}
var car = new Car('red',"prof.ji");
var car1 = new Car('green',"li");
看起来car和car1有了属性是这样的,但是要真正访问要用的话,,是不是也有,继承来的。
改:
Person.prototype.lastName = "li";
function Person(name){
this.name = name;
}
var person = new Person("ming");
他自己身上多了一个lastname,并不是改的原型的。
原型,你想修改他的属性,除非你调用Person.prototype.lastName,否则通过对象想改原型,基本上是不可能的。
增:能不能的给原型增加属性?除非你用Person.prototype来增加属性,改都不可能,增就别提了。
删:这是咋回事?true是哪来的?
person有abc吗,你删除一个她没有的属性,他觉得可以啊。
电脑也不是白痴啊。
function Car(){
}
var car = new Car();
prototype上来她本来就有,我们只不过是在她身加了一些东西,那我现在想看看你这个prototype到底有什么东西,是不是一个纯的空对象。
,constructor是构造器的意思,他会返回这个构造对象的构造函数,
function Person(){
}
Car.prototype = {
constructor : Person//原来的Car,他会变吗?
}
function Car(){
}
var car = new Car();
变成Person了吧,所以说这个constructor是我们可以手动更改的,虽说的系统给的。