前提:
在JavaScript中一切皆对象,分为普通对象和函数对象,每个对象都有原型(undefined和null没有原型,所以undefined和null也就没有toSting方法)。
Object:Object是一个函数对象,Object的原型就是Object。prototype,它里面存在着一些对象的方法和属性,例如最常见的toString方法。
普通对象:用new Object或者{}建的对象是普通对象,它没有prototype属性,只有__proto__属性,它指向Object.prototype。
Array:Array也是一个函数对象,它的原型就是Array.prototype,它里面存在着一些数组的方法和属性,例如常见的push,pop等方法。
Function:Function也是一个函数对象,它的原型就是一个function空函数。
自定义函数:它的原型就是你给指定的内容。如果不指定,那它的原型就是一个Object.prototype,例:function Test(){}; Test.prototype = {name:"张三"};var test = new Test();此时Test的原型就是Test.prototype 。
1.prototype定义:
原型是function对象的一个属性,它定义了构造函数制造出来的对象的公共祖先。通过该构造函数产生的对象,可以继承该原型的属性和方法。原型也是对象。
对象的原型:__proto__
注:对象分为function1对象和Object对象,每个对象都有原型(null和undefined除外,unll和undefind不可以用toString方法)
例1:person和person1它们的共有祖先为Person.prototype
function Person (){
}
var person = new Person();
var person1 = new Person();
例2:自己身上有属性,原型上也有属性,取自己身上的,就近原则
Person.prototype.name = "张三";
function Person (){
this.name = "李四"
}
var person = new Person();
console.log(person.name) //--->李四
例3:可以通过对象改变自己的属性,但是对原型无效,原型属性不可以被对象修改。
例4:请关注属性颜色,浅紫色是系统设置的属性,深紫色是自己设置的属性,__proto__是系统隐式的属性,可以改,但是尽量别改,一般这样的命名代表不希望被修改,例如:_private
注:当你访问一个对象属性时,如果这个对象没有这个属性,就会访问proto这个索引,查找proto里是否有你想要的属性。
有构造函数的情况,每当执行到new关键词时,会在最前面隐式执行var this = {__proto__:Person.prototype}
最后隐式执行 return this
例5:当执行 Person.prototype = {name:"李四"}时,person 已经被定义并且构造了对象,即已经new了,此时person.name继承的是构造函数Person.prorotype.name,所以后定义的Person.prototype = {name:""}还没有覆盖原来的Person.prototype.name ,因此,执行结果为:张三
Person.prototype.name = "张三";
function Person (){
//var this = {__proto__:Person.prototype} 隐式执行
// this.name = "李四"
}
var person = new Person();
Person.prototype = {
name : "李四"
}
console.log(person.name)
例6:Person.prototype.name = "小刘",这种写法是在原来的对象上改变属性值,Person.prototype = {name:"李四"},这种写法是把原型改了,换了个新对象,如下代码,Person.prototype.name = "小刘" 是把原来的“张三”改成了“小刘”,而Person.prototype = {name:"李四"}保留原来的Person.prototype.name = "张三",同是又新健了一个同名对象为Person.prototype.name,这个的是是“李四”
Person.prototype.name = "张三";
function Person (){
//var this = {__proto__:Person.prototype} 隐式执行
// this.name = "李四"
}
Person.prototype.name = "小刘"
var person = new Person();
Person.prototype = {
name : "guojia"
}
console.log(person.name)