先上个例子代码:
function Animal(name, sex) {
this.name = name;
this.sex = sex;
}
Animal.color = "black";
Animal.prototype.heartBeat = true;
Animal.prototype.say = function () {
console.log("My name is: " + this.name);
};
var cat = new Animal("cat", "female");
console.log("cat color: " + cat.color);
console.log("cat heartBeat: " + cat.heartBeat);
console.log("cat sex: " + cat.sex);
console.log("animal color: " + Animal.color);
console.log("animal heartBeat: " + Animal.heartBeat);
console.log("animal sex: " + Animal.sex);
伪代码说明new都做了什么:
var cat = new Animal("cat", "female") 等价于
var cat = {
var obj = {};
obj.__proto__ = Animal.prototype; //这时原型继承的关键,新对象的__proto__指向了函数对象的原型对象
Animal.call(obj, "cat", "female"); //新对象具有了函数对象中的动态属性和方法
return obj;
}
手动写一个new:
function new_(originObj) { var obj = {}; obj.__proto__ = originObj.prototype; originObj.call(obj, "cat", "female"); return obj; }
var cat = new_(Animal);