JS对象创建数组

发布时间:2017-02-19   来源:文档文库   
字号:
1 创建对象
DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Documenttitle> head> <body> <script>



//通过对象字面量创建的对象 var obj={};//没有任何属性的对象 // alert(typeof obj;
var obj1={num1:12,num2:34};//有两个属性 var obj2={x:obj1.num1,y:obj1.num2+3}; // alert(obj2.y; var obj3={ };
"for":'JavaScript关键字',
"king smith":'this is king show time', 'test-attr':'特殊字符必须用放到引号之间', person:{ username:'king', age:12, }
addr:'北京'
/*----------------------*/ //通过new创建对象
var obj4=new Object(;//创建一个空对象,和{}一样 var arr=new Array(;//创建一个空数组,和[]一样 var d=new Date(;//创建一个表示当前时间的Date对象
var r=new RegExp('js'//创建一个可以进行模式匹配的RegExp对象 function Test({
}
var func=new Test(;
function Test1(num1,num2{ this.n1=num1; this.n2=num2; }
var func1=new Test1(2,3; alert(func1.n2;
// alert(func instanceof Test; // alert(typeof func; // alert(typeof Test; // alert(d.prototype;
/*----------------------*/
//通过Object.create(创建对象
var obj5=Object.create({x:1,y:2};
//可以通过传入参数null来创建一个没有原型的新对象,通过这种形式创建的
对象不会继承任何东西,甚至不包括基础方法,像toString(



var obj6=Object.create(null;//不继承任何属性和方法
//如果想创建一个普通的空对象({}或者new Object(创建的对象,需要传入Object.prototype var obj7=Object.create(Object.prototype; script> body> html> 2 属性操作
DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Documenttitle> head> <body> <script>

//属性操作 var person={ username:'king', age:12,

addr:'北京',
sex:''
};
// alert(person.username+'\n'+person['age']+'\n'+person['addr']+'\n'+person.sex; person.age=23; person['test']='this is a test'; delete person.username; // alert(person.username; // for(var attr in person{ // alert(attr; // }

//有些时候只能使用[]来访问
//如果属性名是不确定的,就必须使用[],它允许我们在程序运行期间通过变量实现相关属性的动态存取 var key='age'; alert(person[key]; script> body> html>

3 检测属性
DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Documenttitle> head> <body> <script> function foo({}; foo.prototype.z=3; var obj=new foo(; obj.x=1; obj.y=2;

//通过in检测对象是否有某个属性 // alert('z' in obj;
// alert(obj.hasOwnProperty('z'; obj.z=5;
// alert(obj.hasOwnProperty('z'; // alert(foo.prototype.z; // alert(obj.z; obj.z=undefined; // alert(obj.z; delete obj.z; // alert(obj.z;
delete foo.prototype.z; // alert(obj.z;
//第一个参数是对象的原型,obj1没有x这个属性 var obj1=Object.create({x:1}; // alert(obj1.x;
// alert(obj1.hasOwnProperty('x'; //属性访问错误
//如果属性不存在,则返回undefined // alert(obj1.notExistsProperty;
//如果对象不存在,访问这个不存在对象的属性就会报错误 // alert(obj2.test;
//nullundefined都没有属性 var obj2={ test:{x:1,y:2} }; obj3=obj2.test; delete obj2.test; alert(obj3.y;

script> body> html> 4 in检测包含属性
DOCTYPE html> <html lang="en">

<head> <meta charset="UTF-8"> <title>Documenttitle> head> <body> <script>

//通过in检测对象的自有属性或继承属性中是否包含某个属性 var o={x:1};
// alert('x' in o;
// alert('toString' in o;//o继承toString属性
//对象的hasOwnProperty(方法用来检测给定的名字是否是对象的自有属性 var o={x:1};
// alert(o.hasOwnProperty('x';
// alert(o.hasOwnProperty('toString';
//propertyIsEnumerable(hasOwnProperty(的增强版,只有检测到是自有属性且这个属性的可枚举性为true时它才返回true。某些内置属性是不可枚举的;一般通过JavaScript代码纯关键的属性都是可枚举的,除非在ECMAScript 5中使用一个特殊的方法来改变属性的可枚举性 function Foo({}; Foo.prototype.z=1; var obj=new Foo(; obj.x=1; obj.y=2; // alert('x' in obj; // alert('z' in obj; // alert(obj.hasOwnProperty('x'; // alert(obj.hasOwnProperty('z'; // alert(obj.propertyIsEnumerable('x';

//可以判断某个属性是否是undefiend,但是如果属性存在且值为undefined,此时就不可以了 var o={x:1}; // alert(o.x===undefined; // alert(o.y===undefined; // alert(o.toString===undefined;

//枚举属性
//通过for/in遍历对象中所有可枚举的属性(包含自有属性和继承的属性 var obj={x:1,y:2,z:3}; // for(p in obj{ // alert(p; // }
//返回所有自有属性的名称
// alert(Object.getOwnPropertyNames(obj;
// alert(obj.propertyIsEnumerable('z';//继承来的
// alert(Object.prototype.propertyIsEnumerable('toString';//不可枚//通过字面量定义存取器属性



/*var o={

//普通的数据属性 data_prop:value,
//存取器属性都是成对定义的函数 get accessor_prop({}, set accessor_prop(value{} }; */
var p={

//xy是普通的可读写的数据属性 x:1.0, y:1.0,
//r是可读写的存取器属性,它有getersetter get r({return Math.sqrt(this.x*this.x+this.y*this.y;}, set r(newvalue{ var oldvalue=Math.sqrt(this.x*this.x+this.y*this.y; var ratio=newvalue/oldvalue; this.x*=ratio; this.y*=ratio; }, get theta({return Math.atan2(this.y,this.x;} }; Object.getOwnPropertyDescriptor(p,'r'; // p.x=5; // p.y=10; // alert(p.theta; var random={ get octet({return Math.floor(Math.random(*256;} }; Object.getOwnPropertyDescriptor(random,'octet'; // alert(random.octet; // alert(Object.getOwnPropertyDescriptor({x:1},'x';

script> body> html>
5 修改属性
DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Documenttitle> head> <body> <script> var o={}; Object.defineProperty(o,'x',{ value:12, writable:true, enumerable:false, configurable:true };



Object.defineProperty(o,'y',{ value:'king', writable:true, enumerable:true, configurable:true };
Object.defineProperty(o,'z',{ value:3 // writable:false, // enumerable:false, // configurable:false };
// alert(o.x;
// alert(Object.keys(o;//x不可枚举,y可枚举 // for(var p in o{ // alert(p; // }
Object.defineProperty(o,'x',{writable:false}; o.x=5; o.y=34;
// alert(o.y; // alert(o.x;
Object.defineProperty(o,'x',{value:56}; // alert(o.x; // alert(o.z; o.z=56;
// Object.defineProperty(o,'z',{value:32};//不可配置 // alert(o.z;
//x从数据属性修改为存取器属性 Object.defineProperty(o,'x',{ get:function({return 10;} };
// alert(o.x; /*
传入Object.defineProperty(的属性描述对象不必包含所有4个特性。对于新创建的属性来说,默认的特性值是falseundefined。对于修改的已有属性来说,默认的特性值没有做任何修改。注意这个方法要么修改已有属性要么新建自有属性,但不能修改继承属性。 */ //可以通过Object.defineProperties(同时创建或修改多个属性 var p=Object.defineProperties({},{ x:{value:1,writable:true,enumerable:true,configurable:true}, y:{value:2,writable:false,enumerable:true,configurable:true}, z:{value:3,writable:true,enumerable:false,configurable:true}, r:{ get: function({return Math.random(;}, enumerable:true, configurable:true } }; for(var prop in p{ alert(prop; } script> body> html>

6 检测对象原先
DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Documenttitle> head> <body> <script>
//检测一个对象是否是另一个对象的原型(或处于原型链中,可以通过isPrototypeOf(方法

var p={x:1};
var o=Object.create(p;
// alert(p.isPrototypeOf(o;
// alert(Object.prototype.isPrototypeOf(o;
//类属性class
function classof(o{ if(o===null return "Null"; if(o===undefined return "undefined"; return Object.prototype.toString.call(o.slice(8,-1; }
var x=null; x=undefined; x=132; x='king'; x=false; x={}; x=[];
x=/test/;
x=new Date(; x=window;
x=function({}; function f({}; x=new f(;
// alert(classof(x;

//对象的可扩展性

script> body> html> 7 constructor
DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>title> head> <body>
<script type="text/javascript"> var o=new Object(;
alert(o.constructor==Object;

var a=new Array;
alert(a.constructor==Array; var n=new Number(3;
alert(n.constructor==Number; script> body> html>
8 defineProperities DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>title> head> <body> <script type="text/javascript"> var obj={}; Object.defineProperties(obj,{ "username":{ value:'king', writable:true }, "age":{ value:12, writable:false } }; // alert(obj.age; // obj.age=33; // alert(obj.age; //alert(obj.username; //obj.username='queen'; //alert(obj.username; script> body> html>
9 没有继承属性
DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>title> head> <body> <script type="text/javascript"> //Object.defineProperty(obj,'key',{ // __proto__:null,//没有继承的属性 // value:'static' //}; //
////alert(obj.key; ////for(p in obj{

//// alert(p; ////}
////keys=obj.keys; ////alert(keys;
//Object.defineProperty(obj,'key1',{ // enumerable:false, // configurable:false, // writable:false, // value:'king' //};
//alert(obj.key1;
var o={};//创建一个对象
Object.defineProperty(o,'a',{ value:12, writable:true, enumerable:true, configurable:true };
//alert(o.a; //o.a=345; //alert(o.a;
////for(var p in o{ //// alert(p; ////}
//delete o.a; //alert(o.a; var bValue;
Object.defineProperty(o,'b',{ get : function({return bValue;}, set : function(newValue{bValue=newValue;}, enumerable:true, configurable:true };
//alert(o.b; //o.b=389; //alert(o.b; //Writable特性
var o = {}; // 创建一个新对象

Object.defineProperty(o, "a", { value : 37,
writable : false }; console.log(o.a; // 打印 37
o.a = 25; // 没有错误抛出(在严格模式下会抛出,即使之前已经有相同的值) console.log(o.a; // 打印 37 赋值不起作用。

//Enumerable特性 var o = {};
Object.defineProperty(o, "a", { value : 1, enumerable:true }; Object.defineProperty(o, "b", { value : 2, enumerable:false };
Object.defineProperty(o, "c", { value : 3 }; // enumerable defaults to false
o.d = 4; // 如果使用直接赋值的方式创建对象的属性,则这个属性的enumerabletrue

for (var i in o { console.log(i;

}
// 打印 'a' 'd' (in undefined order

Object.keys(o; // ["a", "d"]
o.propertyIsEnumerable('a'; // true o.propertyIsEnumerable('b'; // false o.propertyIsEnumerable('c'; // false

//Configurable 特性
//configurable 特性表示对象的属性是否可以被删除,以及除 writable 特性外的其他特性是否可以被修改。 var o = {};
Object.defineProperty(o, "a", { get : function({return 1;}, configurable : false } ;

//Object.defineProperty(o, "a", {configurable : true}; // throws a TypeError
//Object.defineProperty(o, "a", {enumerable : true}; // throws a TypeError //Object.defineProperty(o, "a", {set : function({}}; // throws a TypeError (set was undefined previously //Object.defineProperty(o, "a", {get : function({return 1;}}; // throws a TypeError (even though the new get does exactly the same thing //Object.defineProperty(o, "a", {value : 12}; // throws a TypeError console.log(o.a; // logs 1 delete o.a; // Nothing happens console.log(o.a; // logs 1
//如果 o.a configurable 特性已经为 true,没有错误会被抛出,并且属性会在最后被删除。

//考虑特性被赋予的默认特性值非常重要,通常,
//使用点运算符和Object.defineProperty(为对象的属性赋值时,数据描述符中的属性默认值是不同的 var o = {};
o.a = 1; // 等同于 : Object.defineProperty(o, "a", {value : 1,
writable : true, configurable : true, enumerable : true};

// 另一方面,
Object.defineProperty(o, "a", {value : 1}; // 等同于 : Object.defineProperty(o, "a", {value : 1,
writable : false, configurable : false, enumerable : false};



10 freeze DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>title> head> <body>
<script type="text/javascript"> var obj = {
prop: function ({}, foo: "bar" };

// 可以添加新的属性,已有的属性可以被修改或删除 obj.foo = "baz";
document.write(obj.foo; obj.lumpy = "woof";
document.write(obj.lumpy; delete obj.prop;

var o = Object.freeze(obj;

//alert(Object.isFrozen(obj === true;

// 现在任何修改操作都会失败 //obj.foo = "quux"; // 静默失败
//obj.quaxxor = "the friendly duck"; // 静默失败,并没有成功添加上新的属性 //alert(obj.foo;
//alert(obj.quaxxor;
// ...在严格模式中会抛出TypeError异常 //function fail({ //"use strict";
////obj.foo = "sparky"; // 抛出TypeError异常 //delete obj.quaxxor; // 抛出TypeError异常 //obj.sparky = "arf"; // 抛出TypeError异常 //} //
//fail(;

// 使用Object.defineProperty方法同样会抛出TypeError异常
//Object.defineProperty(obj, "ohai", { value: 17 }; // 抛出TypeError异常 //Object.defineProperty(obj, "foo", { value: "eit" }; // 抛出TypeError异常

//潜冻结的例子

obj = {
internal : {}

};

Object.freeze(obj;
obj.internal.a = "aValue";

alert(obj.internal.a; // "aValue"

// 想让一个对象变的完全冻结,冻结所有对象中的对象,我们可以使用下面的函数.

function deepFreeze (o { var prop, propKey;
Object.freeze(o; // 首先冻结第一层对象. for (propKey in o { prop = o[propKey];
if (!o.hasOwnProperty(propKey || !(typeof prop === "object" || Object.isFrozen(prop {
// 跳过原型链上的属性和已冻结的对象. continue; }

deepFreeze(prop; //递归调用. } }

obj2 = {
internal : {} };

deepFreeze(obj2;
obj2.internal.a = "anotherValue"; alert(obj2.internal.a; // undefined

script> body> html>








本文来源:https://www.2haoxitong.net/k/doc/19a2211f02d8ce2f0066f5335a8102d276a26119.html

《JS对象创建数组.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式