var num=3;
var str=“info”;
var fun1=function(){…}
fun1(){…}
var data={name:‘Lucy’,age:30,getInfo:function(){…}}
var obj=new Object();
obj.name=“Lucy”;
这个对象的结果其实和第三个对象是一样的都是可以用{}来表述的。
我们可以很清楚的看出这都是对象,完全没有类的概念,我们最后一个例子里的Object是类么?不,不是的。接下来就要说明一下对象的创建方式。
var obj=new Object();
对象 = new关键字 构造函数;
var man=function(name,age){
this.name=name;
this.age=age;
this.sex='man';
}
var zs=new man('zhangsan',23);
console.log(zs); //[object Object] {[functions]: , __proto__: { },age: 23,name:"zhangsan",sex: "man"}
console.log(zs.age);//23
console.log(zs.sex);//"man"
var man=function(name,age){
this.name=name;
this.age=age;
this.sex='man';
return {info:'error'};
}
var zs=new man('zhangsan',23);
console.log(zs);//[object Object] {[functions]: , __proto__: { },info:"error"}
var man=function(name,age){
this.name=name;
this.age=age;
this.sex='man';
reuturn "hello javascript";
}
var zs=new man('zhangsan',23);
console.log(zs); //[object Object] {[functions]: , __proto__: { },age: 23,name:"zhangsan",sex: "man"}
var zs=new man('zhangsan',23);
var ls=new man('lishi',25);
zs.sex='woman';
console.log(zs.sex);//woman
console.log(ls.sex);//man
function man(name,age){
this.name=name;
this.age=age;
}
man.prototype.sex='man';
man.prototype.getInfo=function(){
return "name:"+this.name+",age:"+this.age;
};
var zs=new man('zhangsan',23);
var ls=new man('lishi',25);
zs.age=22;
console.log(zs.sex);//man
console.log(ls.sex);//man
console.log(zs.getInfo());//name:zhangsan,age:22
console.log(ls.getInfo());//name:lishi,age:25
man.prototype.sex='woman';
console.log(zs.sex);//woman
console.log(ls.sex);//woman
function man(name,age){
this.name=name;
this.age=age;
}
man.prototype.sex='man';
man.prototype.getInfo=function(){
return "name:"+this.name+",age:"+this.age;
};
var zs=new man('zhangsan',23);
var ls=new man('lishi',25);
zs.sex='unchecked';
console.log(zs.sex);//unchecked
console.log(ls.sex);//man
man.prototype.sex='woman';
console.log(zs.sex);//woman
console.log(ls.sex);//woman
man.prototype={
sex:'man',
getInfo:function(){
return "name:"+this.name+",age:"+this.age;
}
}
man.prototype.constructor
new man();
new man.prototype.constructor();
ls.constructor===zs.constructor //true
console.log(man.prototype.isPrototypeOf(zs)); //true
console.log(man.prototype.isPrototypeOf(ls)); //true
console.log(zs.hasOwnProperty("name")); // true
console.log(zs.hasOwnProperty("sex")); // false
var str="hello javascript";
console.log(str.constructor);//function String() {[native code]}
var fun1=function(name){this.name=name}
console.log(fun1.constructor);//function Function() {[native code]}
var obj={name:"zs"};
console.log(obj.constructor);//function Object() {[native code]}
我们说了构造函数,什么样才能算是构造函数呢?所有的函数都可以是构造函数,所有的函数也只有函数可以拥有有prototype属性。而函数也是对象,如上面例子的fun1函数,它也是由Function()构造函数生成的,fun1是函数对象,你可以把fun1当对象用,给他设置属性,方法都是完全没问题的,但是fun1.prototype设置的属性也只能给new fun1()生成的对象使用,不能混淆了。
在阮一峰老师的博客中还说了javascript的继承机制是依靠prototype属性(原型链{prototype chain}模式)来实现的,我个人还是不太理解,因为通过prototype设置“父对象”的属性和方法,只能变成“继承”共享的属性和方法,每个对象自己私有的属性和方法是无法继承的,还是有一些不一样的。而且说是共享只能说是统一赋值,我们通过对象去修改prototype提供的属性并不会影响其他对象的该属性。说是继承但是不太一样。
在理解javascript的对象及对象的创建时要牢记两点,一个是javascript内(几乎)所有的都是对象,并且对象都有构造函数和一些默认方法。比如我有时忘记这两件事,写一些奇怪的范例时就很懵逼,为什么会出现这个结果。如我常忘记prototype属性指向的也是对象,对象也就会有constructor,isPrototypeOf 等这些方法。