原型模式
创建每个函数都有一个原型属性prototype,这个属性是一个指针,指向函数的原型对象。默认情况下,所有原型对象都会自动获得一个constructor(构造函数)属性,这个函数包含一个指向prototype属性所在函数的指针。
调用构造函数创建一个新实例后,该实例的内部将包含一个指针(内部属性),指向构造函数的原型对象。ECMA-262第五版中,这个指针叫[[Prototype]]。
检测对象属性方法:
hasOwnProperty():
检测一个属性存在于原型中,还是实例中。当给定的属性存在实例中,才返回true。hasOwnProperty 是 Object.prototype 的属性,创建一个对象,会继承Object.prototype上面的所有属性。
object.keys(obj):
返回一个包含所有可枚举属性的字符串数组。
// getFoo is a property which isn't enumerable
var myObj=Object.create({},{getFoo:{value:function(){returnthis.foo;}}});
myObj.foo=1;
console.log(Object.keys(myObj));// console: ['foo']
Object.getOwnPropertynames(obj)
返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组。
原型链
原型链的基本模式如下:
function SuperType() {
this.property = true;
}
SuperType.prototype.getSuperValue = function() {
return this.property;
}
function SubType() {
this.subproperty = false;
}
SubType.prototype = new SuperType(); //继承了SuperType
SubType.prototype.getSubValue = function() {
return this.subproperty;
}
var instance = new SubType();
console.log(instance.getSuperValue()); //true
使用不同的方法创建对象:
语法创建:
var o = {a:1};
构造函数创建
function Graph() {
this.vertices = [];
this.edges = [];
}
var g = new Graph(); // 实例化对象 Graph { vertices: [], edges: [] }
Object.create 创建的对象
var a = {a:1};
var b = Object.create(a);
console.log(b);
每个实例对象都有一个私有属性__proto__指向函数的原型对象。
所有函数的默认原型都是Object的实例,都有一个__proto__属性,指向Object.prototype。
class创建对象
class Person {
constructor(name) {
this.name = name;
}
getName() {
console.log(this.name);
}
}
var person1 = new Person('tom');
console.log(person1);
参考
JavaScript高级程序设计