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 会发生不同的事情,即使walk
bob 和 ben 的操作完全相同,但this
会引用当前对象(bob for鲍勃和本本)。
当我做类似的事情时,会发生跟踪成员ben.walk=22
,即使 bob 和 benwalk
将 22 分配给 ben.walk 不会影响 bob.walk。这是因为该语句将创建一个名为walk
ben 的成员并将其赋值为 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(以“这个变量”开头)