是的var fn = 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 处于绿灯状态,那么显然即使 walk 对 bob 和 ben 执行相同的操作但 @987654331 也会发生不同的事情@ 将引用当前对象(bob 为 bob,ben 为 ben)。
当我执行ben.walk=22 之类的操作时,会出现阴影成员,即使 bob 和 ben 共享 walk 将 22 分配给 ben.walk 不会影响 bob.walk。这是因为该语句将在 ben 上创建一个名为 walk 的成员并为其分配值 22。当请求 bob.walk 时,您将获得 Person.prototype.walk 函数,因为在 bob 上找不到 walk .然而,请求 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(以“this变量”结尾)