1、构造函数
funcion Foo (name,age){
this.name=name;
this.age=age;
this.class='class-1';
return this;//默认return this,可不用写
}
var f = new Foo('gouhuan',18);
var f2 = new Foo('zhaohuanling',18);
new一个对象的过程
例如:f,f传递或不传递参数。先将构造函数中的this置为空对象,接着一个一个属性赋值,最后return this,return后,f被赋值。
- 创建一个新对象;
- 然后,this指向这个对象
- 执行代码,给this赋值
- 返回this
构造函数扩展
var a = {}---var a = new Object();
var a = []---var a = new Array();
funcion foo(){}---
var foo = new Funcion();
变量 instanceof 类型
2、原型规则
所有的引用类型(对象、数组、函数)都具有对象的特性,及可自由扩展性。null除外
var a={}; a.a=100;
var b=[]; b.a=100;
function foo(){};
foo.a=100
所有引用类型都包含一个__proto__(隐式原型),他的属性值为一个普通的队形
a.__proto__
b.__proto__
foo.__proto__
所有函数都有一个prototype属性
foo.prototype
所有引用类型的__proto__的值直指(===)其构造函数的prototype
a.__proto__ === Object.prototype;
b.__proto__ === Object.prototype;
foo.__ptoto__ === Object.prototype;
如果试图在一个对象(引用类型)中寻找一个属性,但对象本身没有这个属性,即会在他的__proto__ 即它构造函数的prototype中寻找
function Foo(name,age){
this.name=name;
this.age=age;
}
Foo.prototype.alertName = function(){
alert(this.name);
}
//new 一个新的Foo类型的对象,Foo为构造函数
var f=new Foo('gouhuan');
f.printName = function(){
console.log(this.name);
}
<!--运行结果-->
f.printName();//gouhuan
f.alertName();//弹出gouhuan,
//虽然f对象本身没有alertName属性,但其构造函数的prototype中存在这个属性
for in 遍历对象属性
虽然在目前高级浏览器已经屏蔽了构造函数原想上的属性,但为保证代码的健壮即兼容性,建议使用:hasOwnProperty;
for (item in obj){
if(obj.hasOwnProperty(item)){
console.log(obj.item);
console.log(obj[item]);
console.log(item)
}
}
原型链
f–>f.proto–>(f.proto).prpto
在刚刚的例子中:
f.toString();
则先回在f中找toString属性,没有,则寻找Foo其构造函数的prototype即f本身的隐式原型中查找toString,还是没有。
Foo本身是一个函数对象,则还会继续向上查找
Object.prototype,即Foo.__proto__;
最后合起来就是一个原型链
f.__proto__.__proto__
使用 instanceof,判断引用类型属于哪个构造函数
f instanceof Foo;//true
f instanceof Object;//true
判断逻辑就是,f的__proto__一层层往上,看能否找到对应Foo的prototype。