Javascript构造函数简析

构造函数

根据调研,在使用new操作符通过构造函数实例化一个对象时,经过了以下过程:

  1. 创建一个空对象。
  2. 将这个空对象的__proto__成员指向了构造函数对象的prototype成员对象。
  3. 将构造函数的作用域赋给新对象,因此构造函数中的this指向新对象,然后再在该对象上下文中调用构造函数。
  4. 返回新创建对象。

注意:在JavaScript标准中,并没有__prop__这个属性,不过它现在已经是一些主流的JavaScript执行环境默认的一个标准属性,用于指向构造函数的原型。该属性是默认不可见的,而且在各执行环境中实现的细节不尽相同,例如IE浏览器中不存在该属性。我们只要知道Javascript对象内部存在指向构造函数原型的指针就可以了,这个指针是在调用new表达式的时候自动赋值的,并且我们不应该去修改它。

function Person(msg){

//特权属性(公有属性)

this.myMsg = msg; //只在被实例化后的实例中可调用

this.address = ‘大连‘;

//私有属性

var name = ‘Sumer‘;

var age = 21;

var that = this;

//私有方法

function getName(){

alert(that.name);

}

//公有方法,能被外部公开访问,这个方法每次实例化都要重新构造而prototype是原型共享,所有实例化后,都共同引用同一个

this.getAge = function(){

alert(age); //在公有方法中可以访问私有成员

}

//私有和公有成员在函数的内部,在构造函数创建的每个实例中都会包含同样的私有和公有成员的副本,因而实例越多占用的内存越多

//而且私有成员仅仅是在对象创建时,由构造函数在对象上下文下运行,不具有该对象的直接引用。

}

注意:由于JS函数的作用域特性,这些私有成员,被所有在构造函数中定义的公有方法所共享,而且仅被在构造函数中定义的公有方法所共享。这意味着,在prototype中定义的类成员将不能访问在构造体中定义的私有成员。成员)。

//公有方法,适用于通过new关键字实例化的该对象的每个实例,向prototype中添加成员将会把新方法添加到构造函数的底层中去

Person.prototype.sayHello = function(){

alert(‘hello world!‘);

}

//静态属性

//适用于对象的特殊实例,就是作为Function对象实例的构造函数本身

Person.name = ‘china‘;

//静态方法

Person.alertname = function(){

alert(this.name);

}

//实例化

var m1 = new Person(‘me‘);

//---- 测试属性 ----//

//console.log(Person.name); //china

//console.log(m1.name); //undefined, 静态属性不适用于一般实例

//console.log(m1.constructor.name); //china, 想访问类的静态属性,先访问该实例的构造函数,然后在访问该类静态属性

//console.log(Person.address); //undefined, Person中的this指的不是函数本身,而是调用address的对象,而且只能是对象

//console.log(m1.address); //大连 此时this指的是实例化后的m1

//---- 测试方法 ----//

//Person.alertname(); //china,直接调用函数的类方法

//m1.alertname(); //FF: m1.alertname is not a function, alertname 是Person类的方法,和实例对象没有直接关系

//m1.constructor.alertname(); //china, 调用该对象构造函数(类函数)的方法(函数)

//m1.sayHello(); //hello everyone, myObject类的prototype原型下的方法将会被实例继承

//Person.sayHello(); //Person.sayHello is not a function,sayHello是原型方法,不是类的方法

//---- 测试prototype ----//

//console.log(m1.prototype); //undefined, 实例对象没有prototype

//console.log(Person.prototype); //Object

//alert(Person.prototype.constructor); //console.log返回Person(msg),此时alert()更清楚,相当于Person

//console.log(Person.prototype.constructor.name); //china, 相当于Person.name;

由此分析可以清楚的了解到,使用私有成员,是以牺牲代码可读性为代价的。而且这种实现更多的是一种JavaScript技巧,因为它并不是语言本身具有的机制。不应该过多的应用在JS的模型构建中。公有成员的使用,更能提高我们代码的可读性,使我们构建的模型更加清晰。

时间: 2024-12-28 20:25:40

Javascript构造函数简析的相关文章

Java Annotation 及几个常用开源项目注解原理简析

PDF 版: Java Annotation.pdf, PPT 版:Java Annotation.pptx, Keynote 版:Java Annotation.key 一.Annotation 示例 Override Annotation Java 1 2 3 @Override public void onCreate(Bundle savedInstanceState); Retrofit Annotation Java 1 2 3 @GET("/users/{username}&quo

Android WebView远程代码执行漏洞简析

0x00 本文参考Android WebView 远程代码执行漏洞简析.代码地址为,https://github.com/jltxgcy/AppVulnerability/tree/master/WebViewFileDemo.下面我们分析代码. 0x01 首先列出项目工程目录: MainActivity.java的代码如下: public class MainActivity extends Activity { private WebView webView; private Uri mUr

JDK框架简析--java.lang包中的基础类库、基础数据类型

题记 JDK.Java Development Kit. 我们必须先认识到,JDK不过,不过一套Java基础类库而已,是Sun公司开发的基础类库,仅此而已,JDK本身和我们自行书写总结的类库,从技术含量来说.还是在一个层级上,它们都是须要被编译成字节码.在JRE中执行的,JDK编译后的结果就是jre/lib下的rt.jar,我们学习使用它的目的是加深对Java的理解,提高我们的Java编码水平. 本系列全部文章基于的JDK版本号都是1.7.16. 源代码下载地址:https://jdk7.jav

Android -- MediaPlayer内部实现简析

Android -- MediaPlayer内部实现简析 在之前的博客中,已经介绍了使用MediaPlayer时要注意的内容.现在,这里就通过一个MediaPlayer代码实例,来进一步分析MediaPlayer内部是如何运作.实现的:当然这里的分析只截止到底层调用播放器之前,因为播放器这块实在是没搞懂. 我们使用的例子来源于之前MediaPlayer Playback译文中的官方实例: String url = "http://........"; // your URL here

Nutch学习笔记——抓取过程简析

Nutch学习笔记二--抓取过程简析 学习环境: ubuntu 概要: Nutch 是一个开源Java 实现的搜索引擎.它提供了我们运行自己的搜索引擎所需的全部工具.包括全文搜索和Web爬虫. 通过nutch,诞生了hadoop.tika.gora. 先安装SVN和Ant环境.(通过编译源码方式来使用nutch) apt-get install ant apt-get install subversion [email protected]:~/data/nutch$ svn co https:

CNZZ网站流量统计原理简析

这是我的域名www.iyizhan.com,暂无内容,其中只有一个页面index.html, 在index.html上放置了如下的 js 脚本: <script src="http://s11.cnzz.com/stat.php?id=5364825&web_id=5364825" language="JavaScript"> </script> 1.当用户访问这个页面时,会请求src,对应的是上面的脚本的源文件: Request U

简析Spring MVC 数据解析

简析Spring MVC 数据解析 特别说明:本文使用spring 版本为 4.1.3 常用数据提交方式: 1. form 表单提交数据 1.1 解析form表单数据(无图片等数据) 前端代码事例: <form action="test/entity" method="post"> 用户ID:<input type="text" name="userid"/><br> 用户名:<inp

XMR恶意挖矿案例简析

前言 数字货币因其技术去中性化和经济价值等属性,逐渐成为大众关注的焦点,同时通过恶意挖矿获取数字货币是黑灰色产业获取收益的重要途径.本文简析通过蜜罐获取的XMR恶意挖矿事件:攻击者通过爆破SSH获取系统权限,配置root用户免密登录,并下载及执行XMR 挖矿程序,及XMR 网页挖矿程序.XMR挖矿程序耗肉鸡CPU/GPU资源,网页挖矿程序耗访问肉鸡服务器JS 网页的客户端资源 . 2018年10月11日,攻击者使用恶意IP(223.89.72.8)暴力破解Victim的SSH服务成功,获取系统账

ASCII、Unicode、UTF-8、UTF-16、GBK、GB2312、ANSI等编码方式简析

ASCII.Unicode.UTF-8.UTF-16.GBK.GB2312.ANSI等编码方式简析 序言 从各种字节编码方法中,能看到那个计算机发展的洪荒时期的影子. ASCII ASCII码有标准ASCII码和拓展ASCII码之分,这里分开讲解. 标准ASCII码 标准ASCII码占用一个字节,但是只用了后7位,第一位是0.一个字节本来可以表示256种不同情况,而由此ASCII码只有128种符号.这128种符号包括英文26字母的大小写.数字0-9.32个不可打印的控制字母.符号(就是我们在键盘