- js对象创建
//直接创建
var person = {name:"zhaomomo",sex:"man",age:"12"};
//通过new
var data = new Date();
var arr = new Array();
function Person(){
this.name = "zhaomomo";
this.sex = "man";
this.age = "12";
}
var per = new Person();
- 赋值
js中的赋值其实是引用,下面的perother是对person的引用,改变perother同时改变着person
//直接赋值
var perother = person;
perother.name = "xiaoming";
console.info(person.name); //xiaoming
- 原型和原型链
像上面的Person是个方法,每个js的方法都会有个prototype,我们管它叫原型,prototype中可以存储一些属性和方法,这样的Person就像一个类,Person后面的一个方法就像一个构造函数,而per像Person的一个对象。
Person.prototype.nationality = "china";
console.info(per.nationality; //china
Person.prototype.talk = function(){
console.info("talk");
}
per.talk(); //talk
每个js对象中都有__proto__属性,我们管它叫原型链,__proto__是个隐性属性,应用原型链可以实现继承,上栗中的per.__proto__与Person.prototype相等,而Person又是js的Function继承的,所以Person.__proto__与Function.prototype相等,所以对象通过原型链与类形成了链条的关系,并且改变per的nationality的值不会改变原Person的nationality的值
per.nationality="USA";
console.info(person.nationality); //"china"
对象中的__proto__中有个隐含的构造属性constructor指向类的构造函数 ,constructor中包含了类中的公有静态属性和类方法,__proto__中包含类中的prototype中的属性和方法
- Object.create创建对象
var a = {a1:1,a2:2};
var b = Object.create(a);
console.info(b.__proto__===a) //true
b.a1 = 3;
console.info(a.a1) //1
Object.create是把a赋给b中的原型链,有点继承的味道
- js不同的属性
function Person(){
this.name = "zhaomomo";//公有属性
this.sex = "man";
this.age = "12";
var heart = "warm"//私有属性
}
Person.like = "meimei";//公有静态属性,通过构造器访问
Person.work = function(){};//类方法,痛过构造器访问
Person.prototype.love = "xiaoli"//原型属性
Person.prototype.sleep = function(){};//原型方法
- 属性
对象中的两个方法,getter和setter可以重定义取对象和设置对象的方法
var o={
get r(){
console.info("get");
},
set r(value){
console.info("set");
}
}
o.r //get
o.r = "a" //set
属性有四个特性,值(value),可写性(writable),可枚举性(enumerable),可配置性(configurable),通过Object.getOwnPropertyDescriptor()可获得对象属性特性的描述,通过Object.defineProperty()可以修改对象属性的特性,通过Object.prototype.toString.call(o).slice(8,-1)可以获得o的对象的类型信息
- 检测属性
o.hasOwnProperty("x");可以检测x是否是o的自有属性,继承的属性不是自有属性,propertyIsEnumerable()是hasOwnProperty()增强版,检测可枚举的自有属性,"x" in o,in可以检测o中赋undefined或null的属性,但是用delete删除属性in就检测不到了,for in 检测可枚举的属性
参考