关于构造函数的测试和小结

function Circle( radius ){

this.r = radius;

this.des = "圆形";

this.showInfo = function(){

alert("这是一个"+this.des);

}

}

function Circle_area(r){ return Circle.PI*this.r*this.r; }

function Circle_perimeter(r){ return  2*Circle.PI*r;}

Circle.PI = 3.14;

Circle.perimeter = Circle_perimeter;

Circle.prototype.area = Circle_area;

var c = new Circle(3);

//测试类属性

//alert(Circle.PI )//3.14

//alert(c.PI)//undefined 因为类属性是和类本身,也就是函数本身相关联的,和类实例没有直接关系。

//alert(c.constructor.PI)//3.14 如果想通过类实例访问类属性,那么就需要先访问该实例的构造函数,进而访问该类属性

//alert(Circle.des)//undefined 因为函数Circle函数中的this.des中的this指代的不是函数本身,而是调用r的对象,而且只能是对象。

//alert(c.des)//圆形 this此时为实例化的 对象c。

/*结论:

面向对象的角度:类属性是类对象的直接属性,且该属性与基于该类对象生成的实例对象没有直接关系,无法直接调用。可以直接通过 类名.属性名 调用该类属性。如果想通过该类对象的实例对象调用类属性,那么可以使用 对象实例.constructor属性调用该对象的类对象,然后通过类对象调用其类属性javascript函数角度:类属性是javascript函数对象的直接属性变量(这里之所以称之为属性变量是由于javascript变量和属性的同一性),且该属性变量与基于该函数对象构造出来的对象引用(生成了一个对象,这个对象实际上是一个空对象,并且保存了对构造函数以及构造函数初始化时函数内部this关键字下的相关属性和函数的引用[c.prototype和构造函数中this.下面的相关属性、函数]:)没有直接关系,如果想通过基于构造函数生成的对象c调用构造函数对象的属性变量PI,那么需要通过c.constructor属性找到该构造函数对象,并通过该对象获取其属性变量。

*/

//测试类方法

//alert(Circle.perimeter(3)); //18.4 直接调用函数的类方法。

//alert( c.perimeter(3) ); //FF:c.perimeter is not a function IE:对象或属性不支持此方法。因为perimeter函数是Circle类的类方法,和实例对象没有直接关系

//alert(c.constructor.perimeter(3));//18.84 调用该对象构造函数(类函数)的方法(函数)。

//alert(c.area(3))//28.25.... Circle类的prototype原型属性下的area方法将会被Circle类的实例对象继承。

//alert(Circle.area(3));//FF: 错误: Circle.area is not a function  因为area方法是Circle类的原型属性的方法,并不是Circle类的直接方法。

//结论:同上,把属性换成了方法,把属性变量换成了函数。

//测试prototype对象属性

//alert(c.prototype); //undefined 实例对象没有ptototype属性

//alert(Circle.prototype); //object Object

//alert(Circle.prototype.constructor)//返回Circle的函数体(函数代码体),相当于alert(Circle)

//alert(Circle.prototype.area(3));//NaN 方法调用成功,但是返回结果却是NaN,原因是area函数内部的this.r是undefined。

//alert(Circle.prototype.PI) //undefined因为PI属性是Circle类函数的直接属性,并不会在prototype属性下存在

//alert(Circle.prototype.constructor.PI)//3.14 通过Circle类的原型对象调用该原型对象的构造函数(类函数),再通过类函数调用PI属性。

/*结论:prototype原型对象是javascript基于原型链表实现的一个重要属性。

Javascript角度:1. 实例对象没有prototype属性,只有构造函数才有prototype属性,也就是说构造函数本身保存了对prototype属性的引用。。2. prototype属性对象有一个constructor属性,保存了引用他自己的构造函数的引用(看起来像是个循环:A指向B,B指向A...)3.prototype对象(不要被我这里的属性对象,对象,对象属性搞晕乎了,说是属性对象,就是说当前这个东西他首先是某个对象的属性,同时自己也是个对象。对象属性就是说它是某个对象的属性。)的属性变量和属性对象将会被该prototype对象引用的构造函数所创建的对象继承(function A(){} A.prototype.pa = function(){} var oA = new A(); 那么oA将会继承属性函数pa)。

*/

/*这里对 对象属性,对象方法不再做详细测试。

1.javascript对象实例的在通过其构造函数进行实例化的过程中,保存了对构造函数中所有this关键字引用的属性和方法的引用(这里不讨论对象直接量语法的情况)。但如果构造函数中没有通过this指定,对象实例将无法调用该方法。       2.javascript可以通过构造函数创建多个实例,实例会通过__proto__属性继承原型对象的属性和方法。如果对实例对象的属性和方法进行读写操作,不会影响其原型对象的属性和方法,也就是说,对于原型对象,javascript实例对象只能读,不能写。那当我们对实例对象的属性和方法进行修改的时候也可以改变其值这是为什么呢?其实当我们试图在实例对象中使用继承自原型对象的属性或方法的时候,javascript会在我们的实例对象中复制一个属性或方法的副本,这样,我们操作的时候,其实操作的就是实例对象自己的属性或方法了。

*/

//测试__proto__属性

//alert(c.__proto__)//FF:object IE8:undefined 该属性指向Circle.prototype,也就是说调用该对象将会返回Circle的prototype属性。

//由于IE8及以下版本不支持__proto__属性,所以以下结果都在FF下得出。

//alert(c.__proto__.PI)//undefined 因为函数原型下面没有PI属性,PI是类函数Circle的直接属性

//alert(c.__proto__.area(3))//NaN 该函数执行成功,返回值为NaN是由于函数体中的this.r为undefined。

/*结论:__proto__属性保存了对创建该对象的构造函数引用prototype属性的引用,也就是说构造函数可以引用prototype,基于该构 造函数生成的实例也可以引用,只不过引用的方式不一样。*/

时间: 2024-08-30 16:35:27

关于构造函数的测试和小结的相关文章

C++中 简单查看临时对象,局部对象的生命周期,及拷贝构造函数(测试代码)

#include <iostream> using namespace std; class A {     public: A(int a = 5) {     cout<<"A constructor "<<this<<endl; } ~A() {     cout<<"A destructor "<<this<<endl; } A(const A & r) {     

C++11:移动构造函数的测试

C++11:移动构造函数的测试 代码如下: #include <iostream> #include <stddef.h> #include <Windows.h> using namespace std; class CTest { private: std::size_t size; char* buffer; public: CTest(std::size_t size) : size(size), buffer(nullptr) { buffer = new c

就测试现状小结一下20150909

由于测试受到项目进度.时间成本.人力资源等纬度影响,不可避免会对测试人员的工作造成一定影响,我司就是这样,送测过于频繁,导致测试人员忙于应付,版本质量难以控制,结合现状,小结一下: 1.测试人员应该与项目经理在送测版本之前,确认好测试范围及目标:比如是否需要做全面测试还是针对测试点进行测试,是否只需要跑通流程,对细节方面不做太高要求,比如输入框的长度限制.边界值测试等等. 上述确认完后,接下来测试人员可确定测试粒度进行测试. 2.涉及新功能或功能更改比较大的版本,送测之前,需要开发演示一遍,确保

Web前端渗透测试技术小结(一)

首先端正一下态度不可干违法的事 1.SQL注入测试 对于存在SQL注入的网页,使用SQL语句进行关联查询(仿照C/S模式)eg   http://www.foo.com/user.php?id=1 常见的这样的网址,这样提交到服务器后返回的只能是ID=1的普通信息.做数据库关联查询http://www.foo.com/user.php?id=1 union where id=1 union select password ,1,a from users这样的SQL语句是合法的,如果拂去其端的应用

Charles几个常用测试功能小结

Charles应该是目前最常用的代理软件(之一),使用简单.Charles强大的抓包与协议调试代理功能可以满足我们大部分需求,居然还免费(我可没说有破解版).日常测试中,我吗常用的几个功能主要是抓取网络请求,查看协议内容,修改请求与响应,另外断点功能以及过滤功能也很实用.简单总结下,各位老鸟请无视,本菜鸟还要飞上天呢. 修改网络请求 有时候为了调试服务器的接口,需要修改请求的内容与参数.Charles可以方便我们对网络请参数的修改.在网络请求上右键,选择Edit,即可创建一个新的网络请求,设置请

PHP覆盖率测试工具小结

一.写在最前 这篇文档是我对之前一段时间工作的总结和分享,自己也是第一次涉猎这方面的知识,肯定有遗漏和偏差,甚至“低级错误”,所以想起到抛砖引玉的作用,大家互相分享,共同进步.能够给同学们的工作带来些许启发,我也就很满足了. 二.覆盖率是什么?它能反映什么? 简单的说,覆盖率通常是指程序的执行过程中(即一个case),已执行的代码与可执行的代码的比值(或者与总代码行数的比值).它能够从一个侧面反映出case的质量,即case是否做到对代码的完全覆盖. 三.PHP如何测试覆盖率? 1. Xdebu

[工作笔记之二] 测试工作小结

最近几周跟了两个项目,确切说是一个项目和一个任务. 一.接口测试 任务内容是关于接口的,这次对接口测试有了一个新的认识,顺便感慨一下以前的自己太蠢了.以前测接口,研发都会告诉我怎么测,看到什么样的返回值就就算测完了,所以以前测接口都很快.前段时间整理文档,发现有个老大的测试用例里有关于接口测试的,看进去才知道我测接口测得是多么粗糙啊. 总结一下接口测试: 1. 接口测试也是要写测试用例的. 2. 测试用例中要明确接口地址.各参数类型及意义.返回值的类型.返回值中各字段的含义. 3. 接口中每个参

WordCount测试项目小结

一.本文对应项目GitHub地址 https://github.com/ReWr1te/WCProject 二.项目PSP表格 PSP2.1 PSP阶段 预估耗时(分钟) 实际耗时(分钟) Planning 计划 5 10 · Estimate · 估计这个任务需要多少时间 5 10 Development 开发 355 600 · Analysis · 需求分析 (包括学习新技术) 50 100 · Design Spec · 生成设计文档 10 10 · Design Review · 设计

深度解析C++拷贝构造函数

自2003年开始,断断续续用了12年C++,直到这两年做物联网嵌入式开发,感觉对C++的掌握仅有10%左右.习惯了C#开发,C++倒显得难以下手!今天就一个函数返回问题跟辉月兄弟讨论一番,大有所获,足以解决我们目前80%的问题,感觉对C++的掌握上升到了20%. 背景,现有字节数组ByteArray和字符串String,(不要激动,单片机嵌入式C++很难用起来标准类库)我们需要实现函数String& ByteArray::ToHex()其实这是我们在C#上非常常用的函数,把一个字节数组转为字符串