Yesvar fn = function(){};是 Function 类型
为什么 test.porototype 为空:因为它是 Function.prototype,而不是 Object.prototype
这是什么:在最后发布的链接中回答
您可以使用函数作为构造函数来创建对象:
var Person = function(name){
this.name = name;
};
Person.prototype.walk=function(){
this.step().step().step();
};
在示例中,Person 被称为构造函数,因为它是一个对象,您可以为其赋予属性,例如:Person.static="somthing"这对于与 Person 相关的静态成员非常有用,例如:
Person.HOMETOWN=22;
var ben = new Person("Ben");
ben.set(Person.HOMETOWN,"NY");
ben.get(Person.HOMETOWN);//generic get function what do you thing it'll get for ben?
ben.get(22);//maybe gets the same thing but difficult to guess
当您使用 Person 创建实例时,您必须使用 new 关键字:
var bob = new Person("Bob");console.log(bob.name);//=Bob
var ben = new Person("Ben");console.log(bob.name);//=Ben
属性/成员name是特定于实例的,对于 bob 和 ben 是不同的
成员 walk 可用于所有实例(bob 和 ben 是 Person 的实例)
bob.walk();ben.walk();
因为在 bob(以及后来的 ben)上找不到 walk(),JavaScript 将在 Person.prototype 中查找它。bob 和 ben 都只有一个 walk 函数,但该函数的行为会有所不同,因为它在 walk 函数中使用this.
如果 ben 正在等待红灯,而您将调用 walk 并且 bob 处于绿灯,那么显然 ben 和 bob 会发生不同的事情,即使walkbob 和 ben 的操作完全相同,但this会引用当前对象(bob for鲍勃和本本)。
当我做类似的事情时,会发生跟踪成员ben.walk=22,即使 bob 和 benwalk将 22 分配给 ben.walk 不会影响 bob.walk。这是因为该语句将创建一个名为walkben 的成员并将其赋值为 22。当请求 bob.walk 时,您将获得 Person.prototype.walk 函数,因为walk在 bob 上找不到。然而,询问 ben.walk 会得到值 22,因为成员 walk 是在 ben 上创建的,并且由于 JavaScript 发现 walk on ben,它不会在 Person.prototype 中查找。
因此,当在实例上找不到成员时,JavaScript 引擎将查找构造函数的原型。那么 ben.hasOwnProperty 是从哪里形成的呢?实例 ben 没有它, Person.prototype 没有它。答案是有一个原型链,Person 的构造函数是 Function,所以当在 ben 或 Person.prototype 上找不到 hasOwnProperty 时,它会查找 Person 构造函数的原型(即 Funcition)。如果它在那里找不到hasOwnProperty(但它可以),那么它将查看Function的构造函数的原型(是Object)。
一切都应该从 Object.prototype 继承,除非你这样做Object.create(null,{})在我看来是个坏主意。您可以在 Object.prototype 上添加东西(也不是一个好主意),并且 JS 中的任何对象都将“继承”:
Object.prototype.yipee=function(){
console.log("yipeee");
};
22..yipee();//logs yipeee
"hello".yipee();//logs yipee
现在您已经了解了它的基础知识,您可以查看以下内容:
https://stackoverflow.com/a/16063711/1641941(以“这个变量”开头)