javascript多态、封装和原型链
这些内容将是初级javascript coder迈向初高级的必由之路。
多态
多态指:同一操作作用在不同的对象上,可以产生不同的解释和不同的类。
var googleMap = {
show: function () {
console.log("展示谷歌地图");
}
};
var baiduMap = {
show: function () {
console.log("展示百度地图");
}
};
var sosoMap = {
show: function () {
console.log("展示soso地图");
}
};
function show(map) {
map.show();
}
show(googleMap);
show(baiduMap);
show(sosoMap);
正如我们看到你一样,在JS中我们并不能对对象限制一定拥有某种方法,这是一种鸭子类型的概念,因为javascript若类型语言,并不能限定一个对象必须是某种类型,假如有一只鸡叫声跟鸭子一样,在我们只关注动物叫声的情况下他就是只鸭子。所以导致的结果就是我们对对象拥有的方法并布能做到严格控制,把鸡同鸭讲。
封装
在OOP中我们封装的内容包括:
- 封装数据 我们希望数据在对象创建后就不能被改变
- 封装实现 创建的对象我们并不清楚也不关心具体内部实现方法,只对实现的API感兴趣
- 封装类型 把对象真正的类型隐藏到抽象类和接口之后,典型的代表就是工厂方法
- 封装变化 这是设计模式的目的
这里具体看一下数据封装
var obj = (function () {
var _name = "xin";
return {getName:function(){
return _name;
}};
})();
console.log(obj.getName()); //xin
console.log(obj._name); //undefined
原型链继承
原型链继承应该是javascript最难理解的内容。他的作用就是当对象本身不具有某种属性或方式时先自己的原型对象中进行查找。而原型链理解的关键就是理解对象和原型之间的勾连方式。
function Person(name) {
this.name = name;
}
Person.prototype.getName = function () {
return this.name;
};
var a = new Person('xin');
console.log(a.getName()); //xin
console.log(a.name); //xin
你会发现a对象并没有getname()方法,但依然可以调用,这是因为a的原型对象是Person.prototype,Person.prototype就是指代a原型,我们对他的原型对象添加了了getName方法,使得a自己没有getname方法时可以使用原型上的。
要说明的是new关键字并不是在创建对象,只是先克隆原型对象,然后进行一些额外的操作。
原型对象,对象,构造函数之间的关系如图:
修改构造函数的原型对象指向
var obj = {"name": "xin"};
var A = function () {};
A.prototype = obj;
var a = new A();
console.log(a.name); //xin
直接在对象上修改原型对象
var obj = {"name": "xin"};
var A = function () {};
var a = new A();
a.__proto__ = obj;
console.log(a.name); //xin