- 主题:问个js原型继承的问题
初学js,有个问题想请教一下,关于 js的prototype-based inheritance
具体说来,我对当object里面含有数据成员的时候,derived-type的constructor的prototype应该怎么设置感到疑惑,例如
function Base(name)
{
this.name=name
}
function Derived(name,age)
{
this.name=name; //#1
this.age=age;
}
Derived.prototype=new Base
那么所有的以var d=new Derived("name",12);方式构造的object,都共享同一个__proto__,而这样的话用d.name去修改数值,似乎会影响其他d的name字段。
但经过我的实验,似乎并不会发生这种事情
var d1=new Derived("name1",21);
var d2=new Derived("name2",22);
d1.name="new name"
d2.name!=="new name" //true
那么请问Derived.prototype=new Base这个语句到底干了什么?如果我把#1那行的代码注掉,d1/d2里仍然会有name字段,尽管是undefined:
'name' in d1;//will return true
这个name显然来自于Derived.prototype.name,但又不是同一个,因为对d1的修改并不影响d2。
--
FROM 159.226.171.*
【 在 blitz (blitz) 的大作中提到: 】
: var d1=new Derived("name1",21);
: var d2=new Derived("name2",22);
: d1.name="new name"
: d2.name!=="new name" //true
: 那么请问Derived.prototype=new Base这个语句到底干了什么?如果我把#1那行的代码注掉,d1/d2里仍然会有name字段,尽管是undefined:
: 'name' in d1;//will return true
"name" in d1 -> true
"name" in d2 -> true
"name" in Derived.prototype -> false
"name" in Object.getPrototypeOf(d1) -> false
"name" in Object.getPrototypeOf(d2) -> false
: 这个name显然来自于Derived.prototype.name,但又不是同一个,因为对d1的修改并不影响d2。
({}).hasOwnProperty.call(d1, "name") -> true
--
FROM 183.195.251.*
你这几个判断,我机器上的输出都是true啊,环境时node -v =>v6.1.0
测试代码:
"use strict";
function Base(name)
{
this.name=name
}
function Derived(name,age)
{
//Base.call(this,name);
this.age=age
}
Derived.prototype=new Base("aaa")
var d1=new Derived("name1",22);
var d2=new Derived("name2",23);
console.log("name" in d1)
console.log("name" in d2)
console.log("name" in Derived.prototype)
console.log("name" in Object.getPrototypeOf(d1))
console.log("name" in Object.getPrototypeOf(d2))
【 在 XeCycle (据说是小 X) 的大作中提到: 】
: "name" in d1 -> true
: "name" in d2 -> true
: "name" in Derived.prototype -> false
: ...................
--
FROM 159.226.171.*
oh shit
【 在 blitz (blitz) 的大作中提到: 】
: 你这几个判断,我机器上的输出都是true啊,环境时node -v =>v6.1.0
: 测试代码:
: "use strict";
: function Base(name)
: {
: this.name=name
: }
: function Derived(name,age)
: {
: //Base.call(this,name);
: this.age=age
: }
: Derived.prototype=new Base("aaa")
this is not what is conventionally called "Derived is derived from Base",
so in practice never use this
if you have a very good reason to stack up prototype chain like this, at
least name the functions differently
: var d1=new Derived("name1",22);
: var d2=new Derived("name2",23);
: console.log("name" in d1)
: console.log("name" in d2)
: console.log("name" in Derived.prototype)
: console.log("name" in Object.getPrototypeOf(d1))
: console.log("name" in Object.getPrototypeOf(d2))
--
FROM 180.173.163.*
Derived.prototype=new Base的意思是把Base的实例赋给Derived.prototype。d1/d2里
name是Derived的instance的属性,不是共享的。如果注释掉#1,是通过原型链查找的
Derived.prototype里的、new Base赋值来的name属性。。。JS也没做多久,错了别喷
我。。。
【 在 blitz (blitz) 的大作中提到: 】
: 初学js,有个问题想请教一下,关于 js的prototype-based inheritance
: 具体说来,我对当object里面含有数据成员的时候,derived-type的constructor的
prototype应该怎么设置感到疑惑,例如
: function Base(name)
: ...................
--
FROM 106.120.220.*
我觉得 js 既然 prototype base,就别考虑继承这种 class base 的思维方式了。
【 在 wei507166 (robot-no.9527) 的大作中提到: 】
: Derived.prototype=new Base的意思是把Base的实例赋给Derived.prototype。d1/d2里
: name是Derived的instance的属性,不是共享的。如果注释掉#1,是通过原型链查找的
: Derived.prototype里的、new Base赋值来的name属性。。。JS也没做多久,错了别喷
: ...................
--
FROM 220.160.191.*
为了解释的明白,说的细,就这样了。平时做的时候不这样。
【 在 hgoldfish (老鱼) 的大作中提到: 】
: 我觉得 js 既然 prototype base,就别考虑继承这种 class base 的思维方式了。
--
FROM 106.120.220.*
所有的问题与误解,说明你分不清js的class跟instance
【 在 blitz (blitz) 的大作中提到: 】
: 初学js,有个问题想请教一下,关于 js的prototype-based inheritance
: 具体说来,我对当object里面含有数据成员的时候,derived-type的constructor的prototype应该怎么设置感到疑惑,例如
: function Base(name)
: ...................
--
FROM 123.116.144.41
Derived.prototype=new Base()说白不就是为了隔离原型的作用域么。
var d1=new Derived("name1",21);
var d2=new Derived("name2",22);
d1.prototype.extend = "";这么做会影响到实例d2,目的是向d1添加属性不会影响到d2
于是就有了
d1.prototype = new Base();
实例时传入的参数,仅在其作用域内有效,因此不会影响到原型base
--
FROM 182.48.117.*
new的时候,里边是this直接修改,直接跟prototype没1毛钱关系了。。
lz 估计想知道的是:
func a(), a.p.c = '123',
func b(), b.p.c = '456',
a 与 b 某种关系
new a().c 与 new b().c 的关系吧。
【 在 zzjyingzi (十六点五) 的大作中提到: 】
: Derived.prototype=new Base()说白不就是为了隔离原型的作用域么。
: var d1=new Derived("name1",21);
: var d2=new Derived("name2",22);
: ...................
--
FROM 123.116.144.41