1.原型-prototype
对象有一个特殊的内置属性prototype,所有对象在创建时prototype被赋予一个非空的值
如果一个对象中不存在某个属性,就会到原型链上找一直找,如果能找到返回对应的值,如果找不到返回undefined
使用for..in遍历查找时和查找原型链类似
原型的尽头:Object.prototype
属性设置和屏蔽
给对象设置属性并不是仅仅是添加一个新属性或修改已有属性值
obj.c='6';
a.如果obj对象存在c属性(不管原型链上是否存在c属性),则修改obj对象上添加c属性的值
b.如果obj对象不存在c属性,则在原型链上找c,原型链上找不到,就会添加到obj对象上
c:如果obj对象不存在c属性,
(1)c存在原型链上,并且是可写属性(writable:true),那么直接在obj上添加一个c属性
(2)c存在原型链上,并且是不可写属性(writable:false),那么无法修改已有属性或者obj上创建屏蔽属性,obj.c=6被忽略
(4)c存在原型链上,并且有setter,那么一定会调用这个setter,obj.c=6被忽略
//查看对象obj的属性a的属性描述符:writable,enumerable,configurable
Object.getOwnPropertyDescriptor(obj,'a')
{value: 1, writable: true, enumerable: true, configurable: true}
//属性configurable为true,可以使用以下方法配置属性,如果为false静止使用以下方法,而且静止删除这个属性
Object.defineProperty(obj,'b',{
value:4,
writable:false,
enumerable:true,
configurable:true
})
obj.b=5;
obj.b//4,可写属性是false,不可修改obj.b的值
2.“类”函数
js中只有对象,没有类,类无法描述对象的行为
所有函数默认都有一个名为prototype的公有并且不可枚举的属性,他会指向另一个对象,这个对象被称为Foo的原型
Foo.prototype默认有一个公有并且不可枚举的属性constructor,这个属性引用的是对象关联的函数
function Foo{
prototype:{
constructor:Foo(),
__proto__:{
constructor:Object()
}
}
}
var a=new Foo(),a.constructor在调用new Foo()时创建,最后被关联到这个Foo.prototype对象上的constructor,即Foo.prototype改变,a.constructor改变
function Foo(){
}
var a=new Foo();
Object.getPrototypeOf(a)===Foo.prototype//true;
a.constructor;//Foo()
Foo.prototype.constructor//Foo()
Foo.prototype.constructor=Array();
var c=new Foo()
c.constructor;//[]
js中没有复制机制,不能创建一个类的多个实例,只能创建多个对象,他们的prototype关联的是同一对象,
5.Object.create()会创建对象bar并把它关联到foo,这样可以发挥prototype机制的委托,避免使用new的构造函数调用生成prototype和constructor引用