对象字面量重写整个原型对象

使用对象字面量重写整个原型对象,实例的constructor是什么取决于代码的先后顺序

constructor is person

1
2
3
4
5
6
7
8
9
function person(){}
var person1=new person();
,
person.prototype={
name:"name",
job:"job",
};
alert(person1.constructor===person);
alert(person1.job);/*输出为undefined,因为该实例实现的不是重写后的原型对象*/

constructor isn’t person,is Object

1
2
3
4
5
6
7
8
9
10
function person(){}

person.prototype={
name:"name",
job:"job",
};
var person1=new person();
alert(person1.constructor);
alert(person1.job);/*输出为job,实现了新建的原型对象*/
alert(person.job);/*不能这样访问原型对象的属性,需要实例来访问*/


原因很简单,

1.每创建一个构造函数的时候,都会创建一个原型对象,并且原型对象的constructor都是指向构造函数的。

2.当实例化构造函数放在“对象字面量重写原型对象”之前时,实例的[Prototype]的constructor还是指向构造函数的;重写之后,可能变了,但我们无法知道。

3.当实例化放在“对象字面量重写原型对象”后面时,实例的[prototype]的constructor就会指向object了;一旦重写,现有原型指向构造函数了,但原来的原型就指向object了,而实例化的实例是指向原来的原型的。

不知道这么解释通不通,欢迎知道的到时候给我纠正下。welcome!


继续解释对象字面量问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function person(){}
person.prototype.job="person1";
var person1=new person();
/*使用对象字面量重写原型对象*/
person.prototype={
name:"name",
job:"person2",
};
var person2=new person();

console.log(person1.job);
console.log(person1.prototype);
console.log(person1.constructor);/*观察实例1实现了谁的哪个原型*/

console.log(person2.job);
console.log(person2.prototype);
console.log(person2.constructor);/*观察实例2实现了谁的哪个原型*/

console.log(person.job);
/*不能这样访问原型对象中的属性,需要实例化然后实例访问。即使是在定义了新建原型的constructor:person互相指向情况下*/
console.log(person.prototype);
console.log(person.constructor);
console.log(person.prototype.prototype);
console.log(person.prototype.__proto__);
console.log(person.prototype.constructor);

这里详细分情况解释清楚
深入理解红皮书第六章面向对象6.2创建对象之原型模式,重写原型对象前后
红皮书所谓的 [Prototype]是指实例person1没有prototype属性,给它 虚拟一个Prototype。真实意思是 实现


person1
放在 对象字面量重写原型对象 (不如说是新创建了一个原型对象,因为person的prototype原来的连接已经被破坏了,虽然原原型对象是存在的)之前new
person1实现原来的原型对象中的属性、方法和constructor(默认指向person)以及prototype(未定义情况下均为undefined)


person2
放在 对象字面量重写原型对象 之后new
person2实现新的的原型对象中的属性、方法和constructor(默认指向function Object(){[native code]})以及prototype(未定义情况下均为undefined)。


person
当创建时,同时就拥有了一个原型对象 Object(constructor:person,prototype:undefined)
当使用字面量重写原型对象(以及后面的继承后续)时,又创建了一个新的原型对象
Object(constructor:function Object(){[native code]},prototype:undefined)


实例化
实例化的每一个实例都 共享原型对象中的属性和方法,即一个实例改变了其中的属性和方法,其他实例访问它时它就是被改变后的
实例化的每一个实例都可以重写 构造函数中的属性,变为 己有


prototype
该属性,若不定义(如 constructor:person),一般都是undefined


constructor
默认创建的原型对象中才constructor:person
即person.prototype.age=20;这种叫默认创建的
使用对象字面量重写原型对象以及继承情况下新建的原型对象默认情况下
constructor:function Object(){[native code]}
除非新建原型对象时,定义了constructor:person


proto
任何一个对象在创建之后必有的一个私有属性proto,也是原型链的基础。
function person()={}
var person1=new person();
此时person1.proto===person.prototype
person.proto===Object.prototype
可以将prototype当作指针,constructor&prototype构成了双向链表,这两个属性值一般情况下要定义
虽然未定义实例的prototype值,但自带的proto指向了原型对象,继承了原型对象。以上问题也都得到解答了。


以上均为实践得来,如果有变,估计是浏览器升级了,或者是es有变动。JS是个多变难以解析的奇怪的东西