什么是差异声明变量有和没有原型

时间:2012-06-01 07:39:41

标签: javascript

(通过原型)之间的区别是什么

var Todo = {};

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

Vs(变量和功能“在”对象之外)

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

甚至以下:变量&对象中的函数

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

4 个答案:

答案 0 :(得分:2)

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

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

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

var ObjB = function() {};

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

jsFiddle

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

答案 1 :(得分:2)

想想

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

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

答案 2 :(得分:0)

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

答案 3 :(得分: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