1. Die dritte Codezeile wird nicht verstanden.
Die dritte Zeile sollte als Prototypobjekt zu super_robot
hinzugefügt werden. super_robot
添加 data
作为原型对象。
那为什么不是 SuperRobot.__proto__=data;
而是say.__proto__=data;
Warum heißt es dann nicht SuperRobot.__proto__=data;
, sondern say.__proto__=data
??
function SuperRobot(data) {
var say = function() { return "Hello World!"; };
say.__proto__=data;
return say;
}
var data = { name:"atom", age: 5};
var super_robot = SuperRobot(data);
console.log(super_robot()); //Hello World!
console.log(super_robot.age); //5
console.log(typeof super_robot); //function
此时
super
等于什么?是不是等于
Fun
内声明的a?所以
__proto_
应该加给谁。这样写相当于改写了super_robot的原型链,不能算是扩展,原来super_robot.__proto__指向的是Function.prototype,改写之后super_robot.__proto__指向传入的data对象,可以说改写后super_robot已经不能算是一个真正的函数了,他现在用不了Function原型上的方法,比如call,apply,bind等
如果扩展的话应当写say.__proto__.name = name,say.__proto__.age = age相当于Function.prototype.name = name,Function.prototype.age = age 但是这样会使所有函数实例都能访问到这两个属性,所以一般不建议这样扩展
SuperRobot仅仅是是一个工厂函数,他返回的东西才是核心