var Person = function(name) { this.name = name };
var foo = new Person("foo");
foo // { name: 'foo' }
foo.constructor.toString() // 'function (name) { this.name = name }'
Person.prototype.constructor.toString() // 'function (name) { this.name = name }'
// 改写 constructor 指向的构造函数
Person.prototype.constructor = function(name) { this.name = "bar" }
Person.prototype.constructor.toString() // 'function (name) { this.name = "bar" }'
var foo2 = new Person("foo2");
foo2.constructor.toString() // 'function (name) { this.name = "bar" }'
// 期待是 { name: 'bar' } 因为构造函数已变了
// 但是...
foo2 // { name: 'foo2' }
1
iwege 2016-01-13 22:18:13 +08:00 1
在最后试试 Person.toString() 看看。
Person 本来就是一个 function 了。 要改变的话直接赋值 Person = func 就好了。 |
2
tianzhen OP |
3
banricho 2016-01-14 00:58:56 +08:00 1
1. 函数都有 prototype 对象,其中默认包含一个属性 constructor ,一般情况下默认指向函数自身
2. 以你的例子来说, foo1. __proto__ === Person.prototype ,修改 constructor 是没有用的,它只是一个天生就默认存在的标志,但本身不具备实际意义 3. 你的任何实例化方法本身不存在 toString 方法,那么就会向构造函数 Person 上查找。没有的话就继续向 Function.prototype 上查找,还是没有就继续在 Function.prototype.__proto__ 也就是 Object.prototype 上查找,于是你里面所有的 toString 其实最终调用的都是 Object.prototype.toString 方法 4. 要达到你的效果修改 constructor 是没用的,关键是要在 foo1 和 foo2 之间切断原型链 |
4
banricho 2016-01-14 00:59:58 +08:00 1
@banricho “那么就会向构造函数 Person 上查找” => “那么就会向构造函数 Person.prototype 上查找”
|
5
banricho 2016-01-14 01:12:32 +08:00 1
我搞错了,请看下面的
var Person = function(name) { this.name = name }; var foo = new Person("foo"); console.log(foo.toString === Person.prototype.toString); // true console.log(Person.prototype.toString === Person.prototype.__proto__.toString); // true console.log(Person.prototype.__proto__.toString === Object.prototype.toString); // true console.log(Person.toString === Function.prototype.toString); // true console.log(Function.prototype.toString === Object.toString); // true 我上面说的第 3 点有误。。。 |
6
banricho 2016-01-14 01:20:35 +08:00 1
还得补上这个 = =。
console.log(Person.toString === Function.prototype.toString); // true console.log(Function.prototype.toString === Object.toString); // true console.log(Function.prototype.toString === Function.toString); // true console.log(Function.toString === Object.toString); // true console.log(Function.__proto__ === Object.__proto__); // true 好微妙的关系(好了我去睡了,大晚上脑子混乱又乱扯了。。。) |
7
banricho 2016-01-14 04:02:49 +08:00 1
没睡着 =。= 爬起来**貌似**搞清了,直接上图
|
8
banricho 2016-01-14 04:08:44 +08:00 1
@banricho 我真去睡了
大晚上脑子果然不清醒 Function.prototype.__proto__ 指向的应该是 Object.prototype 而不是 Person 的。。。 啊啊啊啊啊啊啊啊 救命啊好丢人 |
9
banricho 2016-01-14 04:25:45 +08:00 2
补完睡觉,刷屏抱歉
|
13
banricho 2016-01-14 10:29:50 +08:00
|
14
SilentDepth 2016-01-14 13:22:52 +08:00
@banricho 正纳闷这浓浓的 Paper 感是怎么揉进文字的,原来还有后期……
|
15
banricho 2016-01-14 15:26:13 +08:00 via Android
|