简单梳理一遍js的对象和原型
JavaScript对象
再谈this
var py = new Object(); //创建对象
py.name ='py'; //添加属性
py.age=20;
py.run = function(){
return this.name + this.age + '运行中';
}
alert(py.run());
上述的this表示new Object()实例化的对象
通俗点描述就是当前作用域下的对象,也就是py,就这么简单!
工厂模式
为了防止创建多个类似对象而产生出的重复代码,可以使用工厂模式解决
/*工厂模式*/
function createObject(name,age){
var obj = new Object();
obj.name = name;
obj.age = age;
obj.run =function(){
return this.name + this.age + '这是工厂模式'
}
return obj;//返回对象的引用
}
构造函数
比上述的工厂模式更加方便
function School(name, age) {
this.name = name;
this.age = age;
this.run = function(){
return this.name + ',' + this.age;
};
}
以上述例子引申出的构造函数的特点
- 构造函数没有new Object,但在底层他会自动实现var obj = new Object
- this相当于obj
- 构造函数不需要返回对象的引用,它是底层自动返回
- 构造函数的函数名首字母大写
- 必须使用 new
对象冒充
可以使用call();
var obj = new Object();
School.call(obj,'乔布斯',100);
JavaScript原型
即prototype,其用途是包含可以由特定类型的所有实例共享的属性和方法.
/*原型*/
function Man(){};
//原型属性
Man.prototype.name = 'phper';
Man.prototype.age = 100;
//原型方法
Man.prototype.run = function(){
return this.name + this.age;
}
var goodMan = new Man();
var gMan = new Man();
console.log(goodMan.run());
console.log(goodMan.run === gMan.run);//true
和构造函数生成对象看似无异
实例方法:不同的实例化,他们的方法地址是不一样的 ,是唯一的
原型方法:他们的地址是共享的
原型属性
_ proto_
console.log(goodMan.__proto__); //{name: "phper", age: 100, run: ƒ, constructor: ƒ}
alert(goodMan.__proto__); //[object Object]
proto_属性是实例指向原型对象的一个指针,它的作用就是指向构造函数的原型属性 constructor。
通过这两个属性,就可以访问到原型里的属性和方法
isPrototypeOf()
alert(Man.prototype.isPrototypeOf(gMan)); //true
console.log(Man.prototype.isPrototypeOf(gMan)); //true
断一个对象是否指向了该构造函数的原型对象
原型模式执行流程
- 先查找构造函数实例里的属性或方法,如果有,立刻返回;
- 如果构造函数实例里没有,则去它的原型对象里找,如果有,就返回
--end--