/// JavaScript简单重写构造器的原型 - 11GX
首页 > JavaScript简单重写构造器的原型

JavaScript简单重写构造器的原型

 

 1 //简单重写原型对象:
 2 
 3 //一个构造函数Person
 4 function Person(){
 5     
 6 }
 7 //重写Person的原型
 8 //把Person的原型赋值给一个新的对象 是我们重写的过程
 9 Person.prototype={
10     // 对于构造器 如果我们不给他写,则构造器就是Object的构造器了
11 constructor:Person, //加上构造器属性 这里有一点问题 因为构造器属性是不可枚举的,这里无法设置
12 name:"张三",
13     sayName:function(){
14         alert(this.name);
15     }
16 };
17 
18 var p1 = new Person();
19 alert(Person.prototype.constructor);
20 
21 /*
22     以上我们认为模拟重写了一个构造函数的原型
23     但是有很多问题。构造器是不可枚举的,在这里我们无法实现不可枚举属性。
24     
25     在js中提供Object.defineProperty(对象,属性,配置) 来实现设置属性的一些性质
26     重写一个原型就可以这样实现:
27 * */
28 Object.defineProperty(
29     Person.prototype ,     //要配置的对象
30 "constructor",    //配置对象的构造器 构造器
31 {        //构造器的特性
32     enumerable :false,    //构造器 不可枚举
33     value : Person    //构造器的值是Person
34     }
35 );
36 // 通过以上方式重写 就把构造器设置成不可枚举了
37 var p2 = new Person();
38 for(attr in p2){
39     alert(attr);
40 }
41 
42 /*
43     注意:由于语言的动态性
44     
45         在实例化对象之后 如果给原型添加属性或方法,实际上实例对象是能调用后添加的属性和方法
46         实例化之后 重写原型,实际上实例的原型还是指向原来的原型对象 不是新的原型对象
47 */
48 function Person(){
49     
50 }
51 var p1 = new Person();
52 Person.prototype.name="哈哈";
53 alert(p1.name);    //哈哈  因为p1的原型引用调用之前已经添加属性 可以使用
54 
55 var p2 = new Person();
56 Person.prototype = {
57     constructor : Person,
58     name:"xixi"
59 };
60 alert(p2.name);    //哈哈,实例对象之后改变构造器的原型,实例的对象的原型还指向原来的
61 
62 var p3 = new Person();
63 alert(p3.name);    //xixi  因为这是在改变构造器原型之后的实例对象

 

转载于:https://www.cnblogs.com/Lin-Yi/p/7439987.html

更多相关:

  • 文章目录拷贝构造函数重载赋值运算符 赋值运算符和拷贝构造函数最大区别是赋值运算符没有新的对象生成,而拷贝构造函数会生成新的对象。 为了更加形象 准确得描述 赋值运算符和拷贝构造函数得区别,将详细通过代码展示两者之间得差异。 拷贝构造函数 首先从构造函数说起,在C++面向对象的设计中,每一个对象代表一个抽象集合的实体,此时每...

  • 每一个构造函数在被创建的时候,会自动创建一个相应的对象,这个对象就是原型对象,这个函数有一个指向该对象的指针。举个例子:  下面创建了一个函数person。 function person () { } 则 person.prototype 就是原型对象。而原型对象里面又有一个指针,指向函数,即person.prototpe.cons...

  • 这是关于原型链的一系列的现象与原理的解释以及例子 【转载请注明出处与地址】 分成4个部分阐述: 1.如何创建一个对象 2.使用原型链prototype实现对象的继承. 3.原型链上属性和方法的联系与规则 4.深入剖析原型链。 一、如何创建一个对象: 1.使用关键字new创建。 var obj=new Object; 或者 functi...

  • 不透明指针(opaque pointer)可以用来在C中实现封装。 什么是不透明指针(opaque pointer) 从字面意思来看,“不透明”意味着看不到内部,因此“不透明指针”即看不到内部定义的指针。这样说有些抽象,我们来看个例子: #include typedef void *opque_data;...

  • 文章目录前言封装C++实现C 实现继承C++ 实现C实现 前言 为了保证代码的可复用性、可扩展性、可维护性,我们提出了面向对象的思想。 面向对象的核心特性有以下几个 封装特性 信息隐藏或者数据访问保护。类通过暴露有限的访问接口,授权外部仅能通过类提供的方式来访问内部信息或者数据。 封装用来提升代码的可扩展性、可维护性继承特...

  • 容器选择 取的元素很多,频繁的增删元素:linkedlist 涉及到增删,不频繁:linkedlist,arraylist 涉及到了增删,同时涉及到了查询:建议使用arraylist【一般情况增删不多,查询多】   Set:没有顺序,元素不可以重复 Set集合的功能和collection的功能是一致的。   Set两大子类 Hashs...

  • 创建新对象有两种不同的方法: 定义并创建对象的实例使用函数来定义对象,然后创建新的对象实例1.定义并创建对象的实例 var person=new Object(); person.firstname="John"; person.lastname="Doe"; person.age=50; person.eyecolor="blue...

  • 1、引用命名空间: using System.Runtime.Serialization; 2、json的序列化和反序列化的方法: publicclass JsonHelper {///

    /// 序列化/////////