初见此题,没啥好说的,脑海中闪现以下两种方式:javascript
//字面量
var obj={};
//new实例化
var obj=new Object();复制代码
难度就这么点?百度查了查,发现本身理解得有些片面了。以下正解:java
function createPerson(name) {
var obj = {};
obj.name = name;
obj.sayMyname = function() {
console.log(this.name);
};
return obj;
}
var p1 = createPerson('Mike');
p1.sayMyname(); //Mike
var p2 = createPerson('Lily');
p2.sayMyname(); //Lily
console.log(p1 instanceof createPerson); //false
console.log(p1 instanceof Object); //true
console.log(p2 instanceof createPerson); //false
console.log(p2 instanceof Object); //true复制代码
能够明显的感受到,用此方法建立的对象没法识别创造者(这里的创造者全是Object)。app
当new去调用一个函数,这个时候函数中的this就是建立出来的对象,并且函数的返回值就是this(隐式返回)。ide
function createPerson(name) {
this.name = name;
this.sayMyname = function() {
console.log(this.name);
};
}
var p1 = new createPerson('Mike');
p1.sayMyname(); //Mike
var p2 = new createPerson('Lily');
p2.sayMyname(); //Lily
console.log(p1 instanceof createPerson); //true
console.log(p1 instanceof Object); //true
console.log(p2 instanceof createPerson); //true
console.log(p2 instanceof Object); //true复制代码
function Person() {}
Person.prototype.name = 'Mike';
Person.prototype.sayMyname = function() {
console.log(this.name);
};
var p1 = new Person();
p1.sayMyname();复制代码
function CreatePerson(name) { this.name = name;}CreatePerson.prototype.sayMyname = function() { console.log(this.name);};var p1 = new CreatePerson('Mike');p1.sayMyname();var p2 = new CreatePerson('Lily');p2.sayMyname();console.log(p1.sayMyname == p2.sayMyname); //true;缘由:都是在原型下面,在内存中只存在一份,地址相同复制代码
属性是否要放在原型下面,就要看该属性是不是可变的,若是不是可变的,就能够放在原型下面,用来公用属性,可变的话放在构造函数下面。函数