声明有和没有原型的变量有什么区别

Whats the difference declaring variables with and without prototypes

本文关键字:变量 什么 区别 原型 声明      更新时间:2023-09-26

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

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

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

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

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

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

想像

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

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

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

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

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

jsFiddle。

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

Todo.prototype也是一个

对象,所以区别在于如果你用原型声明属性,那么从这个原型创建的每个对象都会拥有这个属性,否则,属性仅用于Todo对象本身。

方法 #

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