一、对象创建
1、对象工厂
即使用函数返回对象的方式创建对象:
function CreatePerson(_name){
return {
name:_name,
age:'18'
}
}
var p1 = CreatePerson('张三');
2、new 关键字
js同样可以使用new关键字创建对象(该方式会多出部分特性,即原型将在后文提到):
function Person(_name){
this.name = _name;
this.age = '18';
this.say = function(_content){
console.log(_content);
}
}
var p1 = new Person('张三');
p1.say('我是'+p1.name);
二、原型属性初步理解
1、prototype属性
通过new关键字,我仿佛回到了java,但java中的类可以定义静态属性和方法又该如何实现,学到原型属性总算可以完成了。例:
function Person(){
this,name = '张三';
}
Person.prototype.count = 5;//添加公有属性,也可以是一个函数
var p1 = new Person();
var p2 = new Person();
console.log("p1.count = "+p1.count);//5
console.log("p2.count = "+p2.count);//5
可以看到,两个对象都有了count属性,且值是相同的,这就实现了一个公有属性(方法),注:当你使用公有属性并赋值时,对象将会创建该属性,而不是改变原型属性的值,如:
p1.count = 1;//属性的动态创建机制使得当前对象有了自己的count属性
p2.count = 2;
console.log("p1.count = "+p1.count);//1
console.log("p2.count = "+p2.count);//2
此时得到的将会是两个值,那如何操作公有属性呢,你可以通过访问对象的构造器,再访问原型属性来实现如:
var p3 = new Person();//p1,p2添加了count属性所以新建一个对象用于示例
p3.constructor.prototype.count++;
console.log(p3.count);//6
此处的操作方式略显复杂,当然在java中也不提倡这样的写法,最好用以下方式操作:
Person.prototype.count++;
另外也可以将以上代码封装为一个函数以简化书写。
2、__proto__属性
除了构造函数中含有prototype属性,在每个对象中还含有一个__proto__属性(注意:只有chrome等少量浏览器支持,所以不要去使用,用于学习理解即可),该属性指向与prototype指向相同的公共对象,但要注意,当你改变了prototype的引用,当前构造函数已经创建的对象还是在使用之前的公共属性:
Person.prototype = {//此处改变了原型属性指向的对象,之前只改变了共有对象中的某个属性
count:100,
color:'yellow'
};
console.log(p3.count);
var p4 = new Person();//此时p4使用了新的公有属性
console.log(p4.color);//yellow(之前的p1,p2,p3不能使用新建的属性)
图示:
这就是当你改变prototype的引用后之前创建的对象所用的公共属性并未改变的原因。