主流的面向对象语言有两大类,基于类的和基于原型的。java是典型的基于类,而javascript则是基于原型的语言代表。
什么叫做基于原型?就如同是基于一个模板去copy出另一个对象并可以做模板基础上做新的改动,这与java中先有类再去实例化一个对象不同,因为我们随时可以创建一个javascript对象并基于它去创造另一个对象,并随时改变原型对象的属性,也就是说它更具有"高动态性"。
从 ES6 以来,JavaScript 提供了三个内置函数,以直接地操纵原型。
1.Object.create
根据指定的原型创建新对象,原型可以是 null;
2.Object.getPrototypeOf
获得一个对象的原型;
3.Object.setPrototypeOf
设置一个对象的原型。
Object.create代码示例:
var cat = {
say(){
console.log("meow~");
},
jump(){
console.log("jump");
}
}
var tiger = Object.create(cat, {
say:{
writable:true,
configurable:true,
enumerable:true,
value:function(){
console.log("roar!");
}
}
})
var anotherCat = Object.create(cat);
anotherCat.say();
var anotherTiger = Object.create(tiger);
anotherTiger.say();
我们首先创建了一个“猫”对象,它拥有say和jump两个属性。又根据猫创建了虎,并对继承过来的say属性做了重写。
其中say属性具有的四个特征:
value:就是属性的值。
writable:决定属性能否被赋值。
enumerable:决定 for in 能否枚举该属性。
configurable:决定该属性能否被删除或者改变特征值。
在javascript对象中,其属性分为数据属性和访问器属性,拥有像say这样四个特征的属性就是数据属性。
之后我们可以用 Object.create 来创建另外的猫和虎对象,由于javascript对象运行时的动态性,我们可以通过“原始猫对象”和“原始虎对象”来控制所有猫和虎的行为。
于是,我们可以完全抛开类的思维,利用原型来实现抽象和复用。
最后,javascript同时也有一套对"基于类的面向对象"的模拟,我们可以自由选择原型或者类作为代码的抽象风格。重要的在于,我们需要学会在相应的情况下用面相对象的思想取代函数式编程来优化编码,让编码更高效更易维护。
网友评论