标签:ack 不可 函数 prototype 植物 asi 形式 over rev
-- js的对象是一种无序的数据集合,由若干键值对组成(key-value)组成,里面包含着数据(属性)和方法(动作),它可以代表js中的所有事物。
- 例如将动物抽象成一类对象,此类对象有着动物中特有的属性和动作,不同于植物,而动物中又分有猪,狗,鸡不同类型的事物对象,这些类型事物对像既有着动物类型的属性和动作,又有着自身独特类型的属性和动作,可以这样一直细分下去,直到每一种动物的个例,也就是对象的实例了,它不仅具备上层事物共有的属性和方法,也有着自己独特个性,是一个独特的个体。
1-1 js的对象如何创建?
-- 对象可通过对象字面量({}),构造函数(如new Object(),或自定义),Object.create等方式创建。
1-1-1 对象字面量,与new Object()创建对象方式的异同?
相同点:创建的对象在使用上是一致的,var a = {} // 是var a= new Object()的语法糖
不同点:初始化的过程有些区别,new Object()是通过构造函数实例化对象,{ }是直接创建JSON对象,且在初始化时可以直接赋值,相比{ }比较高效
1-1-2 访问及修改对象的属性
-- 对象是由键值对组成,对象的键名又称属性(property),都是字符串类型,键名符合标识名条件或是数字可省略" ",系统会默认自动转为对应的字符串,键值可以是任意类型,若键值是函数,则该属性又可被称为方法,像函数般调用。
1-1-2eg1:对象字面量式创建
<script> //对象字面量式创建 var obj = { name: ‘fermin‘, run: function () { alert(‘run‘); } }; obj.age = 18; //添加属性 console.log(obj.age); //18 delete obj.age; //删除属性,注意:不能删除继承的属性,会返回false,删除不存在的属性不会报错,且返回true alert(obj.age); // undefined,访问不存在的属性返回undefined alert("age" in obj); //false, 注意:in对对象拥有的属性都返回ture,无论是否是继承的,无法识别继承属性 console.log(Object.keys(obj)); //["name","run"] //Object.keys()返回所有本身属性名 for (let i in obj) { console.log(i); //name run //for..in 遍历可enumerable的自身和继承的属性,可加obj.hasOwnProperty(i),过滤为自身属性 } obj.run(); //run //用点号访问属性和方法 obj[‘run‘](); //run //用[]访问属性和方法 alert("toString" in obj); //true
</script>
构造函数:构造函数创建对象是借用Object.create(原型) 来实现。
1-1-2eg2:new Object() 创建 (访问和修改对象属性与上述相同)
<script> //new Object()创建 var obj = new Object(); //new可以省略 obj.name = ‘fermin‘; obj.age = 18; //添加属性 obj.run = function () { alert(‘run‘); }; //添加属性 delete obj.age; //删除属性 //delete只能删除对象的属性如:var a=1; delete a //false alert(obj.age); // undefined,访问不存在的属性返回undefined alert("age" in obj);//false console.log(Object.keys(obj)); //["name","run"] for (let i in obj) { console.log(i); //name run } obj.run(); //用点号访问属性和方法 obj[‘run‘](); //用[]访问属性和方法 alert("toString" in obj); //true
</script>
1-1-2eg3:自定义构造函数
<script> //自定义构造函数 function Person(name) { this.name = name; } var obj = new Person("fermin"); obj.age = 18; obj.run = function () { alert("run"); }; //添加属性 alert(Object.keys(obj)); //name,age,run for (let i in obj) { console.log(i); //name age run } obj.run(); // run obj[‘run‘](); // run alert("toString" in obj); //true </script>
1-1-2eg4:Object.create(原型) // Object.create(Object.prototype) <==> new Object()
<script> //Object.create(原型); var obj = Object.create(null); //原型为null,不能继承Object.prototype中的属性 obj.name = ‘fermin‘; obj.age = 18; //添加属性 obj.run = function () { alert(‘run‘); }; //添加属性 delete obj.age; //删除属性 alert(obj.age); // undefined,访问不存在的属性返回undefined alert("age" in obj);//false console.log(Object.keys(obj)); //["name","run"] for (let i in obj) { console.log(i); //name run } obj.run(); //用点号访问属性和方法 obj[‘run‘](); //用[]访问属性和方法 alert("toString" in obj); //false //没有继承Object.prototype中的属性 </script>
1-1-3 new一个对象的过程
var obj = new Function();
1-1-3eg1:模拟new过程
<script>
function Person(name) { this.name = name; } var obj = Person("fermin"); //不用new obj = {}; obj.__proto__ = Person.prototype; Person.call(obj); obj.age = 18; obj.run = function () { alert("run"); }; //添加属性 alert(Object.keys(obj)); //name,age,run for (let i in obj) { console.log(i); //name age run } obj.run(); // run obj[‘run‘](); // run alert("toString" in obj); //true </script>
1-1-4 函数中this的指向问题
-- this的指向在函数执行时才能确定,总是指向调用该函数的对象
1-1-4-eg1:
<script> var obj1= { a:3, b:{ a:10, fn:function(){ console.log(this.a); //undefined console.log(this); //window } } }; var j = obj1.b.fn; j(); //将fn赋值给变量j时,obj调用fn没有执行,所以它最终指向的是window,而不是obj var obj2 = { a : ‘A‘, fn: function () { console.log(this.a); } }; obj2.fn(); //"A" // this ===obj2 obj2.fn.call({a: ‘AA‘}); //"AA" // this === {name: ‘AA‘} var fn1 = obj2.fn; fn1(); //undefined //this === window </script>
2-1 六个实例对象方法,继承Object.prototype
2-2 对象属性的特征 attributes 对象用Object.getOwnPropertyDescriptor(obj,字符串属性名)读取。
2-3 定义对象属性的attributes对象,下面两种方法定义后,属性中的writable,enumerable,configurable的值默认值又都会变为false
2-3-eg1:定义单一attribules属性
<script> var o = Object.defineProperty({}, "p", { value: 3, writable: false, enumerable: true, configurable: false }); alert(o.p); //3 o.p = 33; alert(o.p); //3 //writable为false,修改不了该属性的值 </script>
2-3-eg2:定义多个attributes属性
<script> var o = Object.defineProperties({}, { p1: { value: 3, enumerable: true, writable: true, //configurable值没设定,默认为false }, p2: { get: function () { return this.p1 + 6; }, //有get,就不能直接定义其value值 enumerable: true, configurable: true } }); alert(o.p1); //3 o.p1 = 4; //writable,值为true后,可直接用.或[]修改该属性值, alert(o.p1); //4 alert(o.p2); //10 Object.defineProperty(o, "p1",{value:33}); //若再修改p1其它属性值会报错,因为一开始configurable为false alert(o.p1); //33 //PS:当writable值为false,configurable值为true,只能在defineProperty()中修改 </script>
2-4 对象的拷贝
--将一对象所有属性拷贝到另一个对象上,有重复的属性,将被覆盖
<script> var extend = function (to, from) { for (var property in from) { var descriptor = Object.getOwnPropertyDescriptor(from, property); if (descriptor && (!descriptor.writable || !descriptor.enumerable || !descriptor.configurable || !descriptor.get || !desciptor.set)) { Object.defineProperty(to, property, descriptor); //都拷贝 } else { to[property] = from[property]; //这个else遇存取器定义属性只拷贝值,适用于descriptor的5个特征都具备 } } return to; }; var aa = extend({a:1, b:2}, {a:11, bb:22}); console.log(aa); //{a:11, b:2, bb:22} </script>
2-5 控制对象的状态
2-5-eg:
<script> var o = new Object(); Object.preventExtensions(o); o.p = 1; console.log(o.p); // undefined console.log(Object.isExtensible(o)); //false </script>
标签:ack 不可 函数 prototype 植物 asi 形式 over rev
原文地址:https://www.cnblogs.com/fermin/p/9067391.html