对象——创建对象及操作

Posted y-dt

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对象——创建对象及操作相关的知识,希望对你有一定的参考价值。

创建对象

1.字面量
var obj = {x:1,y:2};
var obj2 = {
    x:1,
    y:2,
    o:{
        z:3,
        n:4
    }
};
2.new
function foo(){}
foo.prototype.z = 3;
var obj = new foo();
obj.y = 2;
obj.x = 1;

obj.x; //1
obj.y; //2
obj.z; //3
type of obj.toString; // ‘function‘
‘z‘ in obj; //true,z从foo.prototype继承而来
obj.hasOwnProperty(‘z‘); //false,obj这个对象本身没有z属性 

技术分享图片

function foo(){}
foo.prototype.z = 3;
var obj = new foo();
obj.y = 2;
obj.x = 1;
obj.z = 5;

obj.hasOwnProperty(‘z‘);//true
foo.prototype.z; //still 3
obj.z;  //5

obj.z = undefined;
obj.z;  //undefined
//此时如果要访问原型z,需要删除obj的z属性
delete obj.z; //true
obj.z; //3

delete obj.z; //再次删除,不会删除原型链
obj.z; //still 3!!!
3.create

创建一个对象,对象的原型指向里面的参数

var obj = Object.create({x:1});
obj.x; //1
typeof obj.toString //‘function‘
obj.hasOwnProperty(‘x‘);//false

var obj = Object.create(null);
obj.toString //undefined

属性操作

读写
var yz;
if(obj.y){ //检测属性
    yz = obj.y.z
}
//利用运算符达到同样效果
var yz = obj && obj.y && obj.y.z
删除
var person = {age:20, title:‘fe‘};
delete person.age; //true
delete person[‘title‘];//true
person.age;//undefined
//再次删除不存在的属性
delete person.age; //true,还是会返回true

delete Object.prototype;//false
//因为Object.prototype被配置为不可修改;
var descriptor = Object.getOwnPropertyDescriptor(Object,‘prototype‘);
descriptor.configurable;//false
检测
var cat = new Object;
cat.legs = 4;
cat.name = ‘Kitty‘;

‘legs‘ in cat;//true
‘abc‘ in cat;//false
‘toString‘ in cat;//true,运算符in会向上查找,toString继承于Object.property
//检测属性是否为自身拥有
cat.hasOwnProperty(‘legs‘);//true
cat.hasOwnProperty(‘toString‘);//false
//检测属性是否可枚举
cat.propertyIsEnumberable(‘legs‘);//true
cat.propertyIsEnumberable(‘toSgring‘);//false
自定义属性
Object.defineProperty(cat,‘price‘,{enumerable:false,value:1000});
cat.propertyIsEnumberable(‘price‘);//false
cat.hasOwnProperty(‘price‘);//true

补充:属性一旦设置configurable:false,将不可再变回可配置

遍历属性
//如果不想遍历原型链的属性
for(key in obj){
    if(obj.hasOwnProperty(key)){
    //do something
    }
}
Object.defineProperty(obj, prop, descriptor)

该方法多数默认值为false,而我们常用的定义方式多为可枚举,删除,赋值等

参数
obj
  要在其上定义属性的对象。
prop
  要定义或修改的属性的名称。
descriptor
  将被定义或修改的属性描述符。
  
---

该方法允许精确添加或修改对象的属性。通过赋值来添加的普通属性会创建在属性枚举期间显示的属性(for...in 或 Object.keys 方法), 这些值可以被改变,也可以被删除。这种方法允许这些额外的细节从默认值改变。默认情况下,使用Object.defineProperty()添加的属性值是不可变的。


数据描述符和存取描述符均具有以下可选键值:

数据描述符

  • configurable
    当且仅当该属性的 configurable 为 true 时,该属性描述符才能够被改变,同时该属性也能从对应的对象上被删除。默认为 false。
  • enumerable
    当且仅当该属性的enumerable为true时,该属性才能够出现在对象的枚举属性中。默认为 false。
  • value
    该属性对应的值。可以是任何有效的 javascript 值(数值,对象,函数等)。默认为 undefined。
  • writable
    当且仅当该属性的writable为true时,value才能被赋值运算符改变。默认为 false

存取描述符

  • get
    一个给属性提供 getter 的方法,如果没有 getter 则为 undefined。该方法返回值被用作属性值。默认为 undefined。
  • set
    一个给属性提供 setter 的方法,如果没有 setter 则为 undefined。该方法将接受唯一参数,并将该参数的新值分配给该属性。默认为 undefined。















以上是关于对象——创建对象及操作的主要内容,如果未能解决你的问题,请参考以下文章

Android:使用 putExtra 从片段访问容器活动对象?

有没有办法使用相同的布局动态创建片段并向它们显示数据?

旋转时保留Fragment对象

Java多线程概述及创建

设计模式之原型模式(Prototype)详解及代码示例

对象——创建对象及操作