1.构造函数:
function Foo(name,age){// Foo构造函数名大写
this.name =name;
this.age = age;
// return this; //即使不写,构造函数也默认返回this,最好不写
}
var f = new Foo("lala",12);//创建实例
(执行过程:(1)this 变成空对象
(2)属性赋值
(3)return this 赋值给 f
)
扩展:引用类型都有构造函数
var obj = {} //本质是 var obj = new Object() 的语法糖
var arr = [] // var arr = new Array()
function Foo(){...} //var Foo = new Function(...)
(instanceof判断引用类型属于哪个构造函数,例: f instanceof Foo;判断逻辑:f的_proto_,一层一层向上找,能否对应到 Foo.prototype)
2.原型规则
以下所说的引用类型均指(对象、数组、函数,不包括null)
(1)所有引用类型,均可自由扩展属性(具有对象特性)
(2)所有引用类型,均有一个隐式原型属性(_proto_属性),属性值是一个普通对象
(3)只有所有函数,均有一个显示原型属性(prototype属性),属性值是一个普通对象
(4)所有引用类型,_proto_属性值 指向它的构造函数的 prototype属性值
(obj._proto_ === Object.prototype)
(5)当想要得到一个引用类型的某一属性时,如果其本身不具有该属性,则会去它的_proto_(即它的构造函数的 prototype)中寻找
知识补充:
1.通过对象属性形式执行函数(例:obj.del()),this 指向对象本身
2.for(item in obj){ // for in在大多数浏览器屏蔽了来自原型的属性
if(obj.hasOwnProperty(item)){} //建议加上判断
}
3.原型链
相关问题:
1.原型链继承的例子-封装DOM查询:
function Elem(id){ //构造函数
this.elem = document.getElementById(id)
}
Elem.prototype.html = funcion(val){
var elem = this.elem;
if(val){
elem.innerHtml = val;
// return this //最好不写 (链式操作)
}else{
rerurn elem.innerHtml
}
}
Elem.prototype.on = funcion(type,fn){
var elem = this.elem;
elem.addEventListener(type,fn); //addEventListener可以多次绑定同一个事件并且不会覆盖上一个事件
}
var div = new Elem("XXX");
div.html("<p>明天你好<p>").on("click",function(){ //链式调用
alert("Hello World")
});
2.描述new对象的过程:
(1)创建一个新对象;
(2)this 指向这个新对象;
(3)执行代码(this 赋值);
(4)返回 this;
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。