一,对象的声明
1.创建一个Object实例方式
var car = new Object();
car.color = red;
car.type = 'porsche';
car.model = '911';
car.desc = function(){
console.log( '这个汽车是'+ this.type+'型号是:'+this.model+',
颜色 为:'+this.color);
}
2.对象字面量方式
var car = {
color:red,
type:'porsche',
model:'911',
desc:function(){
console.log( '这个汽车是'+ this.type+'型号是:'+this.model+',颜色为:'+this.color);
}
}
3.构造函数方式
function Car(color,type,model){ // 构造函数(普通函数 被new 实例化了)
this.color = color;
this.type = type;
this.model = model;
this.desc = function(){
console.log( '这个汽车是'+ this.type+'型号是:'+this.model+',颜色为:'+this.color);
}
}
var car1 = new Car(red,'本田','雅阁')
4.原型模式
function Car(){};
Car.prototype.color = red;
Car.prototype.type ='本田';
Car.prototype.model = '思域';
var Car = new Car();
5.工厂模式
function Car(color,type,model){
let obj = new Object();
obj.color = color;
obj.model = model;
obj.type = type;
obj.desc = function (){
console.log( '这个汽车是'+ obj.type+'型号是:'+obj.model+',颜色为:'+obj.color);
}
return obj;
}
let Car1 = new Car(red,'本田','雅阁')
二,对象的属性
1.数据属性
数据属性包含一个数据的位置,这个位置可以读取和写入值 数据属性有4中描述
**Configurable:**表示能否通过delete 删除属性从而重新定义属性,能否修改属性的特性
或者把属性的特性或者把属性修改为访问器属性,
例如:直接在对象上定义的属性,这个特性默认为true
var person = {};
Object.defineProperty(person,'name',{
configurable:false,
value:'Nicholas'
});
alert(person.name); // "Nicholas"
delete person.name;
alert(person.name); // "Nicholas"
Enumerable: 表示能否通过for-in 循环返回属性,默认值为true,
Writable: 表示能否修改属性的值,它的这个属性默认值为ture
var person = {};
Object.defineProperty(person,'name',{
writable:false,
value:"Nicholas"
})
alert(person.name); // "Nicholas"
person.name ="Greg";
alert(person.name); // "Nicholas"
Value: 包含这个属性的数值,读取属性值的,从这个位置读;写入属性的时候把新值
保存在这个位置,这个属性的值默认是undefined;
2.访问器属性
访问器属性不能直接定义,必须使用Objeact.defineProperty()来定义
** Configurable:**表示能否通过delete 删除属性从而重新定义属性,能否改变属性的
的特性,或者能否把属性的特性,或者能否把属性修改为访问属性,
直接在对象上定义的属性,这个特性默认为true
Enumerable: 表示能否通过for-in 循环返回属性,像前面例子中那样直接在对象上定义
的属性,默认值为true
** Get:**在读取属性时调用的函数。默认值为undefined.
Set 在写入属性时调用的,默认值为undefined
var book = {
_year:2004,
edition:1
}
Object.defineProperty(book,"year",{
get:function(){
return this._year;
},
set:function(newValue){
if(newValue > 2004){
this._year = newValue;
this.edition += newValue - 2004;
}
}
})
book.year = 2005;
console.log(book.edition) //2
var obj = {
_x:"obj._x",
_y:"obj._y",
_z:"Obj._z"
}
Object.defineProperty(obj,"x",{ // x属性,只读不写
get:function(){
return this._x;
}
});
console.log(obj.x); // "obj._x"
obj.x = "Rewrite x"; // 尝试修改x属性
console.log(obj.x); // "obj.x" 写入失败
三,对象的原型及原型链
1.原型
Object.prototype 是所有对象的原型,处于原型链的最底层,里面存在着一些对象的
属性和方法,例如常见的toString方法。
Array.prototype 它里面存在着一些数组 的方法和属性,例如push等。
Function.prototype 是所有函数对象的原型,包括构造函数。
2.原型链
每一个对象都有一个指向它的原型对象的内部链接,这个对象又有自己的原型,
直到某一个对象的原型为null 为止(也就是不在有原型指向),组成这个条链接
最后一环,这一级一级的链结构被称为 原型链
3.prototype与_proto_
函数都有一个原型属性prototype 指向自身的原型,而由这个函数创建的的对象也有
一个_proto_属性指向这个原型,函数原型是一个对象,所以这个对象也会有一个
_proto_指向自己的原型,这样逐层深入直到Object 对象的原型,这样就形成了原
链。普通对象没有prototype,但有_proto_属性。
4.constructor
constructor 属性用于对当前对象的构造函数的引用