- 主题:问个js原型继承的问题
俄,是····
func a(){};
func b(){};
func c(){};
b.prototype = new a();
c.prototype = new a();
是为了让b和c继承a的属性。
更改b.prototype或者c.prototype,不会相互影响。
而
var d1=new Derived("name1",21);
var d2=new Derived("name2",22);
d1 d2是两个实例对象,他们之间只是同一对象原型的下级,除此之外没关系。
【 在 shaolin 的大作中提到: 】
: new的时候,里边是this直接修改,直接跟prototype没1毛钱关系了。。
: lz 估计想知道的是:
: func a(), a.p.c = '123',
: ...................
--
修改:zzjyingzi FROM 182.48.117.*
FROM 182.48.117.*
【 在 zzjyingzi (十六点五) 的大作中提到: 】
: 俄,是····
: func a(){};
: func b(){};
: func c(){};
: b.prototype = new a();
: c.prototype = new a();
: 是为了让b和c继承a的属性。
: 更改b.prototype或者c.prototype,不会相互影响。
conventionally we say "b.prototype = Object.create(a.prototype)", maybe
also adding "b.prototype.constructor = b"
: 而
: var d1=new Derived("name1",21);
: var d2=new Derived("name2",22);
: d1 d2是两个实例对象,他们之间只是同一对象原型的下级,除此之外没关系。
--
FROM 183.195.251.*
js中寻找一个instance的属性,先从instance中找,没有则往其constructor(class)
的prototype中找,还没有,则一直往其parent class的prototype中找,
直到object ..
constructor这东西,写继承得复写一下。
【 在 XeCycle (据说是小 X) 的大作中提到: 】
: conventionally we say "b.prototype = Object.create(a.prototype)", maybe
: also adding "b.prototype.constructor = b"
--
FROM 123.116.144.41
function find(o, name) {
var p = o;
while (p) {
if (p has own property name)
return own property name of p;
p = Object.getPrototypeOf(p);
}
}
【 在 shaolin (我的大小宝贝儿...) 的大作中提到: 】
: js中寻找一个instance的属性,先从instance中找,没有则往其constructor(class)
: 的prototype中找,还没有,则一直往其parent class的prototype中找,
: 直到object ..
: ...................
--
FROM 183.195.251.*
prototype base class 属于借助语言特性的Class 模拟实现玩法,就像其他态语言的继承内部机制也有接近prototype base的,但是语言特性语法都是class。
就像有人用C的structure也可以模拟实现OO,但C++ OO肯定是C系OO的主流。
【 在 hgoldfish 的大作中提到: 】
: 我觉得 js 既然 prototype base,就别考虑继承这种 class base 的思维方式了。
:
--
修改:dhcn FROM 221.216.94.*
FROM 221.216.94.*
明显误解了,new 的意思相当于是构建一个空对象,然后将constructor的prototype对象assign给这个对象,然后将constructor内的this指向这个对象,然后执行constructor,最后返回这个对象,所以:
1. 最终得到的对象和constructor.prototype不是同一个对象,但是这个对象包含prototype的所有属性与方法(在没有被constructor复写的情况下值相等)
2. 如果prototype的某个属性是一个premitive value,那么在得到对象上修改这个属性并不会影响prototype,但是如果是一个引用,再去改这个引用的内部值,就会影响prototype:
function Ctor(name, profile) {
name && (this.name = name);
profile && (this.profile = profile);
}
Ctor.prototype.name = 'hello world';
Ctor.prototype.profile = {address: 'tokyo'}
var inst1 = new Ctor('hello'); // 重写了name
var inst2 = new Ctor(void 0, {address: 'redirect'}); // 重写了profile
var inst3 = new Ctor(); // 没有重写
inst1.name = 'hello 2';
inst2.name = 'hello world 2';
inst3.name = 'hello world 3';
// 以上3条都不影响prototype
inst1.profile = {address: 'new profile address'}
// 不会影响prototype,只是自身的profile指向了一个新地址
inst2.profile.address = 'new address';
// 也不会影响prototype,因为这里的profile地址在构建的时候就已经指向了另一个地址
inst3.profile.address = 'modified address 2';
// 会影响prototype,也会影响其它构建过了没有修改过的实例,因为指向同一个地址
console.log(inst1.name, inst2.name, inst3.name);
// hello 2 hello world 2 hello world 3
console.log(inst1.profile, inst2.profile, inst3.profile, Ctor.prototype.profile);
// Object {address: "new profile address"} Object {address: "new address"} Object {address: "modified address 2"} Object {address: "modified address 2"}
--
FROM 114.249.216.*
high hand.
【 在 acrazing (acrazing) 的大作中提到: 】
: 明显误解了,new 的意思相当于是构建一个空对象,然后将constructor的prototype对象assign给这个对象,然后将constructor内的this指向这个对象,然后执行constructor,最后返回这个对象,所以:
: 1. 最终得到的对象和constructor.prototype不是同一个对象,但是这个对象包含prototype的所有属性与方法(在没有被constructor复写的情况下值相等)
: 2. 如果prototype的某个属性是一个premitive value,那么在得到对象上修改这个属性并不会影响prototype,但是如果是一个引用,再去改这个引用的内部值,就会影响prototype:
: ...................
--
FROM 183.95.135.*