重写函数对象prototype属性值的不同的情况下实例对象的内部属性Prototype值有所不同

http://www.cnblogs.com/cmptlgg/ 我的博客园

重写函数对象的prototype属性值:会切断实例的[[Prototype]]内部属性和最初函数对象的prototype(原型对象)的联系

这个例子引用js高级第三版;

/*

这是高三对此实现的解释。
尽管可以随时为原型添加属性和方法,并且修改能够立即在所有对象实例中反映出来,但如果是重
写整个原型对象,那么情况就不一样了。我们知道,调用构造函数时会为实例添加一个指向最初原型的
[[Prototype]]指针,而把原型修改为另外一个对象就等于切断了构造函数与最初原型之间的联系。
请记住:实例中的指针仅指向原型,而不指向构造函数。看下面的例子。

*/

下面我们来看看ecma标准中是如何实现这些操作的;个人只是简说,并不完全。
function Person(){//创建函数时,就会创建一个函数对象P在函数对象创建的算法中  会为P对象创建一些属性其中包括内部属性(用[[]]表示)。内部属性初始化为P.[[prototype]]=Function.prototype;

P.prototype=new Object()产生一个新对象充当P的原型对象;
}
var friend = new Person(); //new运算符会调用 之前Person函数对象的[[Construct]] 此内部方法,看看它的算法步奏(简写并不完全);obj 为新创建的 ECMAScript 原生对象。为此Obj对象创建内部属性;obj.[[prototype]]=Person.prototype;获取前的函数对象中的prototype属性。后面一些步奏省略。最后会返回[[construct]]的结果是一个对象。

//我们知道,创建函数对象时prototype属性值是初始化的new Object()。
Person.prototype = {/*此处修改了之前创建的函数对象P.prototype,

但是new出来的新对象的[[Prototype]]的值 在修改p.prototype之前就已经初始化为obj.[[prototype]]=Person.prototype.所以new出的对象的[[Prototype]]的值还是指向之前的Person.prototype。可以看到此值并没有被修改*/
constructor: Person,
name : "Nicholas",
age : 29,
job : "Software Engineer",
sayName : function () {
alert(this.name);
}
};
friend.sayName(); //error 所以这里报错了。关于这里是如何查找对象的属性就不说了。不在这章的范围。

//这里我们把var friend = new Person();放到修改prototype属性的后面情况又不一样了。原因还是因为有没有把new出的对象的[[Prototype]]属性给修改。如果给修改了。就指向修改的值。

function Person(){
}
Person.prototype = {这里直接把函数对象的prototype属性值给修改成一个新对象;
constructor: Person,
name : "Nicholas",
age : 29,
job : "Software Engineer",
sayName : function () {
alert(this.name);
}
};

var friend = new Person();//这里最后会返回[[Construct]]的结果是一个对象。在此内部方法的行为中很明显它的NEW出的新对象的[[Prototype]]=Person.prototype;之前创建的函数对象的prototype的值被修改了。这里的值是一个指针,指向一个对象,称为原型对象。

friend.sayName(); 弹出"Nicholas";//最后总结一下,归根到底就是一个执行流程的一个先后顺序的关系,顺序不一样。结果也会不同。此文章当中有什么错误的地方,请大家评论下,谢谢

web技术+winapp技术 学习交流群162791594
时间: 2024-11-01 14:36:28

重写函数对象prototype属性值的不同的情况下实例对象的内部属性Prototype值有所不同的相关文章

C++对象模型——"无继承"情况下的对象构造(第五章)

5.2 继承体系下的对象构造 当定义一个object如下: T object; 时,实际上会发生什么事情呢?如果T有一个constructor(不论是由user提供或是由编译器合成),它会被调用.这很明显,比较不明显的是,constructor的调用真正伴随了什么? constructor可能内带大量的隐藏码,因为编译器会扩充每一个constructor,扩充程度视 class T的继承体系而定.一般而言,编译器所做的扩充操作大约如下: 1.记录在member initialization li

"无继承" 情况下的对象构造

考虑以下代码: Point global; //1) Point Foobar() { Point local; //2) Point *heap = new Point; //3) *heap = local; //4) //...stuff... delete heap; //5) return local; //6) } 1), 2), 3) 为三种不同的对象产生方式: global内存配置, local 内存配置和 heap 内存配置. 4) 把一个object 指定给另一个, 6) 设

ORACLE不使用工具的情况下获取对象DDL

set line 200set pagesize 0set long 99999set feedback offset echo off获得表.索引.视图.存储过程.函数的DDL:select dbms_metadata.get_ddl('TABLE','TABLE_NAME','TABLE_OWNER') from dual;select dbms_metadata.get_ddl('INDEX','INDEX_NAME','INDEX_OWNER') from dual;select dbm

【Golang】如何不反序列化为前提的情况下,修改ProtoBuffer某个Tag的值

当你从客户端接收到一串序列化后的数据,你需要 - 修改其中某一个标签的值,然后把它传递到真正的业务数据,这样每个业务模块(微服务)就不需要和公共授权服务打交道了. - 因为传递的数据的长度,类型甚至是新的字段的新增的造成不稳定,因此 network->originBytes - > Marshal() -> Object -> Unmarshal()->newBytes->Logic Service 会造成很大的损耗 因此设想是否考虑一个优化方式: network-&g

不定义临时变量情况下,交换两个变量的值

1 #include <iostream> 2 using namespace std; 3 4 5 void swap(int& x,int& y) 6 { 7 y = x + y; 8 x = y - x; 9 y = y - x; 10 } 11 12 int _tmain(int argc, _TCHAR* argv[]) 13 { 14 int a = 10, b=20; 15 cout << "before swap: a= "<

JavaScript函数内部属性和函数方法

函数是对象,有自己的属性和方法 .首先通过console下输出的函数属性方法来直观的看一下: 函数内部属性只要包括两个特殊的对象:arguments和this. 函数属性包括:length和prototype 函数方法(非继承)包括:apply()和call() 继承而来的函数方法:bind().toString().toLocaleString().valueOf() 其他的目前不熟,后面再补充 1. 函数内部属性 在函数内部,有两个特殊的对象,arguments和this. argument

JS面向对象篇二、什么是原型?原型对象与实例对象、构造函数的关系及相关方法

本文内容: 1.构造函数.原型对象与实例对象之间的关系: 2.isPrototypeOf()和Object.getPrototypeOf(); 3.实例对象上与原型对象上同名的属性处理: 4.hasOwnProperty()方法和in操作符判断属性来自实例对象本身还是它的原型对象: 5.for-in.Object.keys()和Object.getOwnPropertyNames()方法获取实例对象或者原型对象上的属性: 6.需注意的特殊问题 构造函数.原型对象与实例对象 function Pe

js中的内部属性与delete操作符

本文正式地址:http://www.xiabingbao.com/javascript/2015/08/03/javascript-delete-configurable 在讲解Configurable之前,我们首先来看一道面试题: a = 1; console.log( window.a ); // 1 console.log( delete window.a ); // false console.log( window.a ); // 1 var b = 2; console.log( w

实例对象、构造函数、原型之间的关系

实例对象.构造函数和原型之间的关系 实例对象 实例对象中只有__proto__属性,所有的实例都指向自己构造函数的原型.__proto__属性里面有构造器construction和__proto__. 构造器指向原型所属的构造函数,__proto__属性指向Object的原型. 实例对象里面有一个特例: 这个是一个特例,里面有prototype和__proto__俩个属性,__proto__指向Function的原型,prototype是一个单纯的对象,是一个Object的实例,相当于{},就是