JavaScript精炼之构造函数
除了创建对象,构造函数(constructor) 还做了另一件有用的事情—自动为创建的新对象设置了原型对象(prototype object) 。原型对象存放于 otype 属性中。
例如,我们重写之前例子,使用构造函数创建对象“b”和“c”,那么对象”a”则扮演了“otype”这个角色:
// 构造函数function Foo(y) { // 构造函数将会以特定模式创建对象:被创建的对象都会有"y"属性 this.y = y;}// "otype"存放了新建对象的原型引用// 所以我们可以将之用于定义继承和共享属性或方法// 所以,和上例一样,我们有了如下代码:// 继承属性"x"otype.x = ;// 继承方法"calculate"ulate = function (z) { return this.x + this.y + z;};// 使用foo模式创建 "b" and "c"var b = new Foo();var c = new Foo();// 调用继承的方法ulate(); // ulate(); // // 让我们看看是否使用了预期的属性( b.__proto__ === otype, // true c.__proto__ === otype, // true // "otype"自动创建了一个特殊的属性"constructor" // 指向a的构造函数本身 // 实例"b"和"c"可以通过授权找到它并用以检测自己的构造函数 tructor === Foo, // true tructor === Foo, // true tructor === Foo // true ulate === b.__proto__ulate, // true b.__proto__ulate === ulate // true);
上述代码可表示为如下的.关系:
构造函数与对象之间的关系
上述图示可以看出,每一个object都有一个prototype. 构造函数Foo也拥有自己的__proto__, 也就是otype, 而otype的__proto__指向了otype. 重申一遍,otype只是一个显式的属性,也就是b和c的__proto__属性。
这个问题完整和详细的解释有两个部分:
面向对象编程.一般理论(OOP. The general theory),描述了不同的面向对象的范式与风格(OOP paradigms and stylistics),以及与ECMAScript的比较。
面向对象编程Script实现(OOP. ECMAScript implementation), 专门讲述了ECMAScript中的面向对象编程。
现在,我们已经了解了基本的object原理,那么我们接下去来看看ECMAScript里面的程序执行环境[runtime program execution]. 这就是通常称为的“执行上下文堆栈”[execution context stack]。每一个元素都可以抽象的理解为object。你也许发现了,没错,在ECMAScript中,几乎处处都能看到object的身影。
下面给大家介绍JavaScript constructor 属性详解
对象的constructor属性用于返回创建该对象的函数,也就是我们常说的构造函数。
在JavaScript中,每个具有原型的对象都会自动获得constructor属性。除了arguments、Enumerator、Error、Global、Math、RegExp、Regular Expression等一些特殊对象之外,其他所有的JavaScript内置对象都具备constructor属性。例如:Array、Boolean、Date、Function、Number、Object、String等。所有主流浏览器均支持该属性。
语法
tructor
返回值
对象的constructor属性返回创建该对象的函数的引用。
示例&说明
以下代码中的[native code],表示这是JavaScript的底层内部代码实现,无法显示代码细节。
// 字符串:String()var str = "张三";eln(tructor); // function String() { [native code] }eln(tructor === String); // true// 数组:Array()var arr = [1, 2, 3];eln(tructor); // function Array() { [native code] }eln(tructor === Array); // true// 数字:Number()var num = 5;eln(tructor); // function Number() { [native code] }eln(tructor === Number); // true// 自定义对象:Person()function Person(){ = "CodePlayer";}var p = new Person();eln(tructor); // function Person(){ = "CodePlayer"; }eln(tructor === Person); // true// JSON对象:Object()var o = { "name" : "张三"};eln(tructor); // function Object() { [native code] }eln(tructor === Object); // true// 自定义函数:Function()function foo(){ alert("CodePlayer");}eln(tructor); // function Function() { [native code] }eln(tructor === Function); // true// 函数的原型:bar()function bar(){ alert("CodePlayer");}eln(tructor); // function bar(){ alert("CodePlayer"); }eln(tructor === bar); // true
-
网页设计的布局
网页设计的工作目标,是通过使用更合理的颜色、字体、图片、样式进行页面设计美化,在功能限定的情况下,尽可能给予用户完美的视觉体验。以下是小编为您带来的网页设计的布局,看看吧!网页设计的布局11、响应式网页设计响应式网页设计是网页设计的一种技术,可在N多种浏...
-
万恶的function在javascript中的运用实例分析
javascript中最有特色而又让你困惑的function算一个了下面看一下常用操作复制代码代码如下:functiondoit(){.....}doit();javascript中的函数我们可以把它当作方法使用复制代码代码如下:varobj=newObject();=function(){.....}();而function实际上就是对象(即F...
-
解决PHP中的Cannot modify header information 问题
我就遇到这种问题,网上找到这个解决的方案,就收藏下写PHP的朋友们肯定遇到过这样一个问题:通过header函数改变http协议头的时候,会出现一个类似下面格式的warning:复制代码代码如下:Warning:Cannotmodifyheaderinformation-headersalreadysentby这是为什么呢?因为在...
-
ASP.NET新型的投票结果显示方法
一个投票功能模块少不了查看投票结果,用进度条显示各个投票结果可以起到一目了然的效果。以下是我的方法,请大家不吝赐教:1:做一张图片用于做进度条,只需要很小的一个图片就可以了,如高20px,宽1px。2:在要显示进度条的单元格中插入image控件,其imageUrl设置为已做好的...