don*_*nut 21 javascript oop prototypal-inheritance prototype-programming
我正在尝试理解创建和使用对象的"JavaScript方式",我认为我遇到了对对象和原型的误解.
在我刚开始的一个新项目中,我决定尝试原型继承.我很困惑,如果这意味着我应该创建一个我打算使用的对象,然后使用如下方法创建其他对象Object.create():
var labrador = {
color: 'golden',
sheds: true,
fetch: function()
{
// magic
}
};
var jindo = Object.create(dog);
jindo.color = 'white';
Run Code Online (Sandbox Code Playgroud)
或者,如果我应该创建一种类,并创建使用它的实例Object.create().
var Dog = { // Is this class-like thing a prototype?
color: null,
sheds: null,
fetch: function()
{
// magic
}
};
var labrador = Object.create(Dog);
labrador.color = 'golden';
labrador.sheds = true;
var jindo = Object.create(Dog);
jindo.color = 'white';
jindo.sheds = true;
Run Code Online (Sandbox Code Playgroud)
在基于类的OOP中有更多的经验,后一种方法对我来说感觉更舒服(也许这是足够的理由).但我觉得原型继承的精神更像是第一选择.
哪种方法更多的是原型编程的"精神"?还是我完全忽略了这一点?
use*_*716 14
的prototype只是另一个目的是其中对象具有的隐式引用.
当你这样做时:
var obj = Object.create( some_object );
Run Code Online (Sandbox Code Playgroud)
...你说你想obj尝试从some_object它们不存在时获取属性obj.
因此,你的第二个例子将更接近你使用它的方式.使用的每个对象都Object.create(Dog)将在其原型链中具有该Dog对象.因此,如果您进行更改Dog,更改将反映在Dog链中的所有对象中.
如果主对象具有与原型对象上存在的属性相同的属性,则该属性将隐藏原型的该属性.一个例子就是null你在属性上设置的值Dog.
如果你这样做:
var lab = Object.create(Dog);
lab.color = 'golden';
Run Code Online (Sandbox Code Playgroud)
......你现在正在影响color房产Dog,所以你不会再得到了null.你没有Dog以任何方式改变,所以如果我创建另一个对象:
var colorless_dog = Object.create(Dog);
Run Code Online (Sandbox Code Playgroud)
...... null当访问该color属性时,这个仍然会从原型链中获得价值.
colorless_dog.color; // null
Run Code Online (Sandbox Code Playgroud)
......直到你影响它:
colorless_dog.color = 'blue';
colorless_dog.color; // 'blue'
Run Code Online (Sandbox Code Playgroud)
所以举个例子:
var lab = Object.create(Dog);
lab.color = 'golden';
lab.sheds = true;
Run Code Online (Sandbox Code Playgroud)
......它看起来像这样:
// labrador // Dog
lab.color---> color:'golden' color:null
lab.sheds---> sheds:true sheds:null
lab.fetch()--------------------------> fetch: function() {
alert( this.color ); // 'golden'
// "this" is a reference to the
// "lab" object, instead of "Dog"
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3533 次 |
| 最近记录: |