原型和原型链
构造函数
-
函数名大写
-
function Foo(name,age){ this.name = name this.age = age this.class = 'class-1' //return this //默认有这一行 } var f = new Foo('张三',20) var f1 = new Foo(‘李松’,21)
-
new一个构造函数返回一个对象的过程
- 首先new的时候把参数传过去,或者不传
- this变成一个空对象
- 在return this,将这个对象返回出来
- f 引用 这个对象的指针
- f1 引用的也是这个对象的指针
构造函数-扩展
-
var a = { } 其实是var a = new Object() 的语法糖
-
var a = [] 其实是var a = new Array() 的语法糖
-
function Foo(){...} 其实是var Foo = new Function(....)的语法糖
-
使用instanceof判断一个函数失火是一个变量的构造函数
原型规则和示例
-
5条原型规则,原型规则是学习原型链的基础
-
1. 所有的引用类型(数组,对象,函数),都具有对象特性,即可自由扩展属性(除了“null”以外)
-
-
2.所有的引用类型(数组,对象,函数),都有一个
__porto__
属性,属性值都是一个普通对象(__proto__
)叫做隐式原型 -
3. 所有的函数,都有一个prototype(显示原型)属性,属性值也是一个普通的对象
-
4. 所有的引用类型(数组,对象,函数),
_prototype_
属性值指向它的构造函数的“prototype”属性值-
console.log(obj.__proto__ === Object.prototype)
-
因为:var obj = {} =>var a = new Object() 语法糖
-
又:Object 是一个构造函数,构造函数都有一个prototype属性
-
又:所有的引用类型都有一个隐式原型,根据第四条
-
所以:它俩完全相等
-
-
**5.**当试图得到一个对象的某个属性时,如果这个对象本身没有这个属性,那么就会去它的
_proto_
即(它的构造函数的prototype)中去寻找-
//构造函数 function Foo(name,age){ this.name = name } Foo.prototype.alertName = function () { alert(this.name) } //创建实例 var f = new Foo('zhangsan') f.printName = function() { console.log(this.name) } //测试 f.printName() f.alertName()
-
//循环对象自身的属性 var item for(item in f){ //高级浏览器已经在for in 中频闭了来自原型的属性 //但是这里建议大家还是加上这个判断,保证程序的健壮性 if(f.hasOwnProperty(item)){ console.log(item) } }
-
原型链
-
//构造函数 function Foo(name,age){ this.name = name } Foo.prototype.alertName = function () { alert(this.name) } //创建实例 var f = new Foo('zhangsan') f.printName = function() { console.log(this.name) } //测试 f.printName() f本身的属性 f.alertName() f隐式原型的构造函数的显示原型的属性 f.toString() //要去 f.__proto__.__proto__中查找
instanceof
- 用于判断
引用类型
属于哪个构造函数的方法