js-原型链

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引用

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值