对象的prototype属性不是说不可写吗,只是保留原型的引用,为什么可以这样用?
发布于 8 年前 作者 jokerdrake 4008 次浏览 来自 问答

function Super(name){ this.name = name; this.colors = [1,2,3]; } function Sub(age){ this.age = age; } Sub.prototype = new Super();

//为什么可以给prototype给一个新的实例啊,不是说不可以写吗? var p1 = new Sub(); //这个p1.prototype呢?感觉有点不明白,相比较,java的面相对象这一块,比这个简单的很多啊

5 回复

为什么不可写?prototype 是给 function用的。

typeof(Sub)  === 'function'
typeof(p1)  === 'object'
typeof(new Super()) === 'object'
typeof(p1.__proto__) === 'object'
p1.__proto__ === Sub.prototype

new 出来的实例不是function,没有 prototype 属性,但有一个 proto

prototype是可写的Object.create的Polyfill中就有这样的用法; js是原型链继承和java的继承方式不一样,你可以查找一些原型链继承的资料看看;

@FoghostCn 恩,我就是正在看这个javascript关于面相对象的一部分,定义对象和实现继承的方式五花八门,比起java来复杂太多,都没有确定的方式.这也可能,js这门语言,设计之初就没想过做什么面向对象的开发,只是后面项目做大了,为了合作开发方便,代码复用,封装,强行弄了面相对象的编程方式吧,总觉得不伦不类.哈哈.

@klesh 为何这段代码, function Person(){}

Person.prototype = { constructor: Person, name: ‘god’, colors: [‘red’,‘blue’], };

function Son(){}

Son.prototype = new Person(); Son.prototype.constructor = Son;

var s1 = new Son(); var s2 = new Son(); Son.prototype = new Array();

console.log(s1.colors);

s1.colors[0] = ‘pig’;

console.log(s2.colors); //输出结果是: [red,blue] [pig,blue] 为什么一开始Son.prototype = new Person();这一句有用,目的是实现继承,那为什么说这一句又没用:Son.prototype = new Array();感觉这一句就是prototype不可写的意思.求解,一直翻书找不到答案.

@jokerdrake Son.prototype = new Person(); // 这句有用, 因为接下来 new Son() 的时候会将原型带到实例的原型中.

Son.prototype = new Array(); // 这句没用的意思是, 它无法影响到在这句之前创建的实例. 如果你在这句之后再 new Son() 输出一下. 就知道了.

new 一个实例的时候, 只是把它的构造函数上的 prototype 拷贝(非深拷贝, 只拷贝引用)到实例上而已.

回到顶部