var x = storage
x.nickname = 'josh'
var nick = storage.nickname
// 因为 x 和 storage 是指向同一个对象的引用 , 所以 nick 为 'josh'
var a = {b={c ={
// a b c 每个都引用一个不同的对象
var e = f = g = {
// a b c 都引用同一个空对象
原型每个对象都连接到一个原型对象上 , 并且它可以从中继承属性 。 所有通过对象字面量创建的对象 , 都连接到 Object.prototype 这个 JavaScript 中标准的对象 。
当你创建一个新对象时 , 你可以选择某个对象作为它的原型 。 JavaScript 提供的实现机制杂乱而复杂 , 但其实它可以明显的被简化 。 我们将给 Object 增加一个 beget 方法 。 这个beget 方法创建一个使用原对象作为其原型的新对象 。
var abc = {
a: 'jeason'
b: 'josh'
abc.fff = 'jeddsdsds'
var another_abc = Object.beget(abc)
console.log(another_abc)
console.log(another_abc.a)
原型对象在更新时是不起作用的 , 当我们对某个对象作出改变时 , 不对触及到该对象的原型 。
another_abc.a = \"daddsds\"
console.log(another_abc)
委托原型对象只有在检索值的时候才会被用到 。 如果我们尝试去获取对象的某个属性值 , 且该对象没有此属性名 , 那么 JavaScript 会试着从原型对象中获取属性值 。 如果那个原型对象也没有该属性 , 那么再从它的原型中寻找 , 以此类推 , 直到最后到达终点 Object.prototype 。 如果想要的属性完全不存在原型链中 , 那么结果就是 undefined 值 。 这个过程称为委托 。
原型关系是一种动态的关系 , 如果我们添加一个新的属性到原型链当中 , 该属性会立即对所有基于该原型创建的对象可见 。
反射检查对象并确定对象有什么属性是件很容易的事情 , 只要试着去检索该属性并验证取得的值 。 typeof 操作符对确定属性的类型很有帮助 。
typeof flight.number //number
typeof flight.airline //string
typeof flight.arrival //object
typeof fligth.test // 'undefined'
请务必注意该圆形链上的任何属性也会产生一个值
typeof flight.toString // 'function'
typeof flight.constructor // 'function'
有两个方法处理这些不需要的属性 , 第一个是让你的程序检查并剔除函数值 。 一般来说 , 做反射的目标是数据 , 因此你应该意识到一些值可能会是函数 。
另一个方法是使用 hasOwnProperty 方法 , 如果对象拥有独有的属性 , 它将返回 true 。 hasOwnProperty 方法不会检查原型链 。
枚举for in 语句可用来遍历一个对象中的所有属性名 。 该枚举过程将会列出所有的属性 , 包括函数和你可能不关心的原型中的属性 , 所以有必要过滤掉那些你不想要的值 。 最为常见的过滤器是 hasOwnProperty 方法 , 以及使用 typeof 来排除函数
for (const name in another_abc) {
if (Object.hasOwnProperty.call(another_abc name)) {
const element = another_abc[name
;
console.log(element)
属性名出现的顺序是不确定的 , 因此要对任何可能出现的顺序有所顺序 。 如果你想要确保属性以特定的顺序出现 , 最好的办法就是完全避免使用 for in 语句 , 而是创建一个数组 , 在其中以正确的顺序包含属性名 。
var storage = {
'first-name': 'jeason'
'middle-name': 'test'
'last-name': 'test2'
'profession': '212121'
var i;
var prototypies = [
'first-name'
'middle-name'
'last-name'
'profession'
for (let i = 0; i < prototypies.length; i++) {
const element = prototypies[i
;
document.writeln(element+ \":\" + storage[element
)
通过使用 for 而不是 for in 可以得到我们想要的属性 , 而不用担心发掘出原型链中的属性 , 并且我们安正确的顺序取得了它们的值 。
- 京东|裁员不忘膈应人,这家互联网大厂送的离职礼物恶心到我了!
- iPhone14|准大学生的数码装备推荐
- 有人觉得中暑就是热出来的,吃一些退烧药就好了,这种做法 蚂蚁庄园今日答案6月28日
- 浮甘瓜于清泉,沉朱李于寒水”描述的是什么场面 蚂蚁庄园今日答案6月28日
- 个头大的车厘子比小樱桃营养价值更高,对吗 蚂蚁新村6月28日答案最新
- 位于广东省阳江市的海陵岛自然资源丰富,景色优美,该岛没有 神奇海洋6月28日答案
- 哪种水果横着切开像星星的形状 蚂蚁庄园今日答案6月29日
- 为验证人类和黑猩猩,是否会产生新的后代,科学家找来5位姑娘!
- 喜马拉雅山出现的“雪人”是何生物?目击者:智商高、攻击性强
- 为什么科学家表示人类“灭绝”的可能性极低?这些理由你赞同吗?
