javascript 对象原型,原型链,属性枚举

以我自己的理解来阐述一下javascript的对象,原型,原型链,属性枚举


javascript的对象,通常是string,array,number,function,Date,null…等等,这是我在使用javascript中经常接触到的.这些都可以看作对象。从javascript的继承及原型来看javascript只有一种结构就是对象。

原型与原型链

从javascript中的原型应该是null了吧,在使用javascript中你申明的每一个东西,都是一个对象,或者是对象的某个属性如 下面的代码 a是window对象的属性,同时也是属一个String对象,b是一个object对象,c是一个数组对象.

话说,window对象好像是由浏览器创建的,不属于javascript内置?
我在翻阅MDN的javascript内置对象时确实没有看到window,当然document这些就不提了

var a='12'; 
var b={};
var c=[];

在 javaScript中,
每个对象都有一个指向它的原型(prototype)对象的内部链接。这个原型对象又有自己的原型,直到某个对象的原型为 null
为止(也就是不再有原型指向),组成这条链的最后一环。这种一级一级的链结构就称为原型链(prototype chain)。

继续上面的话题记录一下,a原型是什么,b的原型是什么,c的原型是什么。用代码来查看一下是这样的,obj.proto获取对象的原型,或者obj.constructor.prototype。同样我们可以采用链式查询继续获取对象的原型的原型

console.log(a.__proto__)                   //输出a的原型   String
console.log(a.constructor.prototype)       //这个是在不支持__proto__的浏览中使用
console.log(a.constructor)                 //输出a的构造函函数. 

console.log(b.__proto__)                   //Object {}
console.log(c.__proto__)                   //[Symbol(Symbol.unscopables): Object]  || Array[0]

console.log(b.__proto__.__proto__)         //输出b的原型的原型     null

这里的c是Symbol我暂且忽略吧,ES6新增的javascript原始类型.我暂时仍理解为就是一个Array原型..如上面访问b的原型的原型,好比一根绳子把它们给串了起来。上面留下了很多的结点。原型链基本也就是这样了。


为什么会产生原型链,理解到这里自己对自己提一个问题?
为什么会产生原型链,理解到这里自己对自己提一个问题?


javascript语言从最开始创建的时候由null 到Object,String,Array,Function这些出来之后,又为每个原型创建了很多方法。为某些方法创建了子方法。这些都是一层一层的继续前人的遗产来的。就好比一个人讲我是谁的儿子,我是谁的女儿,我可以用我爸的车子,我可以住我爸的房子。我拥有了对他们的访问与使用权。甚至在某些情况下我可以修改原型中的一个属性。

这样便产生了一条一条的原型链。 由这些原型链一条一条的纵横交错,这样便组成了一个javascript的世界。
我是世界中的字符串,我的老爸可能是String,也有可能是String的儿子
我是世界中的数组,我是世界中的number,
我是世界中的function(我可以是一个普通的执行函数,也可以是一个拿来构建的工厂的方法构造函数)
都在讲我是谁我他妈是谁,我妈的妈是谁…….

你们这些攻城师都是通过我们在创造。我们是这个世界的原住民,我们在被迫向你们这些攻城师提供无偿服务。

我们在就进行javascript申明创建各种数组据的时候。世界会追踪每一个元素的关系,也就是赋予一个隐形的链条线标计。。

世界说完了。


属性枚举

一个对象里面可以包含有很多属性(key),属性又分为可枚举,与不可枚举。自身的与原型的原型的原型的。。。。

比如属性的定义:

//定义一个构造函数
function  a() {
       this.a=3;            //自身属性b,可枚举
}
a.prototype.c=4             //原型链上的属性,可枚举

var o=new a();

//验证是否是自身的属性
console.log(o.hasOwnProperty('a'))    //true
console.log(o.hasOwnProperty('c'))    //false

什么是枚举。我的理解就是点兵点将.
javascript中迭代对象的属性,可以使用for..in 以及es6的for..of以及Object原型的Object.getOwnPropertyNames(‘传入对象’)方法,如下面的代码

//getOwnPropertyNames 枚举
var arr = ["a", "b", "c"];
Object.getOwnPropertyNames(arr);         //返回一个对象属性名组成的数组

//for in迭代枚举
for(var i in arr){
    console.log(i)
}

这里我引入几个API。

in 判断属性是否在指定的对象中,只要是对象的自身属性,继承属性,Symbols类型属性,不管是可枚举还是不可枚举的属性。都返回true

for ..in 迭代(遍历)一个对象的可枚举属性(包含自身属性,以及继承属性)。不包含Symbols类型。

Obj.hasOwnProperty(prop)
判断对象是否含有指定的(自身)属性,(只要是自身属性,无论是可枚举,以及不可枚举均返回true)
如果对象上拥有自己的hasOwnProperty方法,则被覆盖,失效

Obj.propertyIsEnumerable(prop)
判断当前传的属性名称在对象当前的对象中,是否是(自身的)可枚举属性,如果是返回true

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值