3

(通过原型)有什么区别

var Todo = {};

Todo.prototype.name = "...";
Todo.prototype.hello = function() { ... }

Vs(变量和函数“外部”对象)

var Todo = {}
Todo.name = "..."
Todo.hello = function() { ... }

甚至以下内容:对象中的变量和函数

var Todo = {
    name: "...",
    hello = function() { ... }
}
4

4 回答 4

2

第一个没有意义,因为您正在处理对象实例(({}) instanceof Object === true),它没有prototype属性(Objectdoes)。

您可能正在询问这两种模式之间的区别......

var ObjA = function() {
    this.method = function() {};
};

var ObjB = function() {};

ObjB.prototype.method = function() {};

js小提琴

前者在实例化时会使用更多内存——每个对象都有自己的method. 后者不会每个都有自己的method,对象method上的生命,prototype当它试图在父级上访问时,它是原型链上的下一个命令。

于 2012-06-01T07:47:34.027 回答
2

觉得像

使用原型声明的属性或函数是 Todo 的实例成员。

没有原型声明的属性或函数是 Todo 的静态成员。

于 2012-06-01T07:53:01.110 回答
0

Todo.prototype也是一个对象,所以不同的是如果你用原型声明属性,那么从这个原型创建的每个对象都将具有该属性,否则该属性仅适用Todo于对象自身。

于 2012-06-01T07:44:53.740 回答
0

方法#1 和#2(与示例#3 几乎相同)之间的显着区别在于new关键字,如果您通过原型扩展函数,则需要使用该关键字,例如

var Todo1 = function() {};
Todo1.prototype.name = "Foobar";

var Todo2 = {name: "Foobar" }

var a = Todo1;
console.log(a.name); // no property retrieved

var b = Todo2;
console.log(b.name); // Foobar

var c = new Todo1;
console.log(c.name); // Foobar
于 2012-06-01T07:52:37.483 回答