Javascript 原型方法是如何工作的?
我试图理解原型遗传。但不清楚以下代码:Javascript 原型方法是如何工作的?,javascript,Javascript,我试图理解原型遗传。但不清楚以下代码: var obj1 = { objMethod : function(){ return 'name: ' + this.name; } }; var obj2 = { [[Prototype]] : obj1, name : 'Bhojendra' }; 因此,为了理解代码将要说什么,我尝试了: obj2.objMethod(); obj1.objMethod(); 但是抛出了错误。那么,代码试图对原型说些什么呢?如何使
var obj1 = {
objMethod : function(){
return 'name: ' + this.name;
}
};
var obj2 = {
[[Prototype]] : obj1,
name : 'Bhojendra'
};
因此,为了理解代码将要说什么,我尝试了:
obj2.objMethod();
obj1.objMethod();
但是抛出了错误。那么,代码试图对原型说些什么呢?如何使用此功能?请尝试此功能:
var obj1 = {
objMethod : function(){
return 'name: ' + this.name;
}
};
var obj2 = {
__proto__ : obj1,
'name' : 'Bhojendra'
};
console.log(obj2.objMethod());
console.log(obj1.objMethod());
问题在于如何定义obj2
的原型
摘自:
对象继承自其构造函数的原型属性,而不是其
拥有构造函数的原型被分配给内部
[[Prototype]]属性,在某些浏览器中作为
proto属性
请试试这个:
var obj1 = {
objMethod : function(){
return 'name: ' + this.name;
}
};
var obj2 = {
__proto__ : obj1,
'name' : 'Bhojendra'
};
console.log(obj2.objMethod());
console.log(obj1.objMethod());
问题在于如何定义obj2
的原型
摘自:
对象继承自其构造函数的原型属性,而不是其
拥有构造函数的原型被分配给内部
[[Prototype]]属性,在某些浏览器中作为
proto属性
请试试这个:
var obj1 = {
objMethod : function(){
return 'name: ' + this.name;
}
};
var obj2 = {
__proto__ : obj1,
'name' : 'Bhojendra'
};
console.log(obj2.objMethod());
console.log(obj1.objMethod());
问题在于如何定义obj2
的原型
摘自:
对象继承自其构造函数的原型属性,而不是其
拥有构造函数的原型被分配给内部
[[Prototype]]属性,在某些浏览器中作为
proto属性
请试试这个:
var obj1 = {
objMethod : function(){
return 'name: ' + this.name;
}
};
var obj2 = {
__proto__ : obj1,
'name' : 'Bhojendra'
};
console.log(obj2.objMethod());
console.log(obj1.objMethod());
问题在于如何定义obj2
的原型
摘自:
对象继承自其构造函数的原型属性,而不是其
拥有构造函数的原型被分配给内部
[[Prototype]]属性,在某些浏览器中作为
proto属性
这是无效代码:
var obj2 = {
[[Prototype]] : obj1,
name : 'Bhojendra'
};
您使用的规范语言不是实际语言语法的一部分
目前没有(标准)方法在对象文本中设置原型对象,但它是在ECMAScript 6中实现的
此时,您将能够在浏览器环境和其他决定支持语法的环境中执行此操作:
var obj2 = {
__proto__ : obj1,
name : 'Bhojendra'
};
这目前在某些浏览器中可以使用,但在ECMAScript 6最终包含它之前,它不是一种正式的语法
因此,语言规范通过引用
[[Prototype]]
所做的是对Prototype链中的下一个对象进行一般性引用
例如,假设我有这样一个构造函数:
function Foo() {
this.x = 123;
}
var foo = new Foo();
foo --> Foo.prototype --> Object.prototype --> null
我们从构造函数中创建一个对象,如下所示:
function Foo() {
this.x = 123;
}
var foo = new Foo();
foo --> Foo.prototype --> Object.prototype --> null
现在foo
对象的原型链如下所示:
function Foo() {
this.x = 123;
}
var foo = new Foo();
foo --> Foo.prototype --> Object.prototype --> null
foo
对象的[[Prototype]]
是位于foo.Prototype
的对象。因此,当您在foo
对象上查找属性时,如果找不到,它将继续在foo.prototype
对象上进行搜索。它继续沿着链向下,直到找到您的属性或没有要搜索的对象为止,并返回未定义的
因此,原型遗传的概念性高层次模型是这样的:
function Foo() {
this.x = 123;
}
var foo = new Foo();
foo --> Foo.prototype --> Object.prototype --> null
原型链只是一个对象链。假设您希望有一个对象,如果在该对象上找不到属性,它会自动在另一个对象上查找该属性。假设另一个对象被设置为在另一个对象上查找它。这就是原型链
my_obj -> other_obj -> another_obj
如果在my_obj
上找不到属性,它将在链中的下一个对象上自动搜索该属性,依此类推,直到找到该属性或返回未定义的
JavaScript使用“构造函数”函数以一种有点奇怪和混乱的方式来设置它。更清晰的方法是使用Object.create()
设置它
这是无效代码:
var obj2 = {
[[Prototype]] : obj1,
name : 'Bhojendra'
};
您使用的规范语言不是实际语言语法的一部分
目前没有(标准)方法在对象文本中设置原型对象,但它是在ECMAScript 6中实现的
此时,您将能够在浏览器环境和其他决定支持语法的环境中执行此操作:
var obj2 = {
__proto__ : obj1,
name : 'Bhojendra'
};
这目前在某些浏览器中可以使用,但在ECMAScript 6最终包含它之前,它不是一种正式的语法
因此,语言规范通过引用
[[Prototype]]
所做的是对Prototype链中的下一个对象进行一般性引用
例如,假设我有这样一个构造函数:
function Foo() {
this.x = 123;
}
var foo = new Foo();
foo --> Foo.prototype --> Object.prototype --> null
我们从构造函数中创建一个对象,如下所示:
function Foo() {
this.x = 123;
}
var foo = new Foo();
foo --> Foo.prototype --> Object.prototype --> null
现在foo
对象的原型链如下所示:
function Foo() {
this.x = 123;
}
var foo = new Foo();
foo --> Foo.prototype --> Object.prototype --> null
foo
对象的[[Prototype]]
是位于foo.Prototype
的对象。因此,当您在foo
对象上查找属性时,如果找不到,它将继续在foo.prototype
对象上进行搜索。它继续沿着链向下,直到找到您的属性或没有要搜索的对象为止,并返回未定义的
因此,原型遗传的概念性高层次模型是这样的:
function Foo() {
this.x = 123;
}
var foo = new Foo();
foo --> Foo.prototype --> Object.prototype --> null
原型链只是一个对象链。假设您希望有一个对象,如果在该对象上找不到属性,它会自动在另一个对象上查找该属性。假设另一个对象被设置为在另一个对象上查找它。这就是原型链
my_obj -> other_obj -> another_obj
如果在my_obj
上找不到属性,它将在链中的下一个对象上自动搜索该属性,依此类推,直到找到该属性或返回未定义的
JavaScript使用“构造函数”函数以一种有点奇怪和混乱的方式来设置它。更清晰的方法是使用Object.create()
设置它
这是无效代码:
var obj2 = {
[[Prototype]] : obj1,
name : 'Bhojendra'
};
您使用的规范语言不是实际语言语法的一部分
<