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

Javascript 声明有原型和没有原型的变量有什么区别,javascript,Javascript,(通过原型)之间有什么区别 Vs(变量和函数“外部”对象) 或者甚至包括以下内容:对象中的变量和函数 var Todo = { name: "...", hello = function() { ... } } Todo.prototype也是一个对象,因此区别在于,如果您使用prototype声明属性,那么从该原型创建的每个对象都将拥有该属性,否则,该属性仅用于Todo对象本身。在处理对象实例(({})时,第一个属性没有意义instanceof Object===true),

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

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

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

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

Todo.prototype
也是一个对象,因此区别在于,如果您使用prototype声明属性,那么从该原型创建的每个对象都将拥有该属性,否则,该属性仅用于
Todo
对象本身。

在处理对象实例(
({})时,第一个属性没有意义instanceof Object===true
),它将不具有
prototype
属性(
Object
有)

你可能会问这两种模式之间的区别

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

var ObjB = function() {};

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


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

方法#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
想一想

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


未声明prototype的属性或函数是Todo的静态成员。

示例2和3几乎相同。第一个属性或函数甚至不起作用,因为默认情况下对象实例没有prototype属性。
var ObjA = function() {
    this.method = function() {};
};

var ObjB = function() {};

ObjB.prototype.method = function() {};
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