惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

人人都是产品经理
人人都是产品经理
Microsoft Security Blog
Microsoft Security Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园_首页
Hugging Face - Blog
Hugging Face - Blog
美团技术团队
G
GRAHAM CLULEY
H
Hackread – Cybersecurity News, Data Breaches, AI and More
阮一峰的网络日志
阮一峰的网络日志
L
Lohrmann on Cybersecurity
S
Security @ Cisco Blogs
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
S
Security Affairs
The Cloudflare Blog
A
About on SuperTechFans
Google DeepMind News
Google DeepMind News
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Spread Privacy
Spread Privacy
Y
Y Combinator Blog
V2EX - 技术
V2EX - 技术
罗磊的独立博客
F
Full Disclosure
Jina AI
Jina AI
S
Schneier on Security
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
C
CXSECURITY Database RSS Feed - CXSecurity.com
Webroot Blog
Webroot Blog
雷峰网
雷峰网
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Recorded Future
Recorded Future
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
博客园 - 三生石上(FineUI控件)
K
Kaspersky official blog
V
Visual Studio Blog
Vercel News
Vercel News
Cyberwarzone
Cyberwarzone
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
T
Tor Project blog
Cloudbric
Cloudbric
Hacker News - Newest:
Hacker News - Newest: "LLM"
爱范儿
爱范儿
L
LINUX DO - 最新话题
GbyAI
GbyAI
Attack and Defense Labs
Attack and Defense Labs
H
Heimdal Security Blog
Recent Announcements
Recent Announcements
L
LINUX DO - 热门话题
L
LangChain Blog
Simon Willison's Weblog
Simon Willison's Weblog

博客园 - NextStep-V

新年学习进行时:关于十二生肖的英文表达 姓名音韵 不完全解码 ON REG EXPRESSION.SYNTAX - NextStep-V on abap and ocx WBS ON wedding project (marked) ON sap portal (I) Dijest :on Web Dynpro or BSP FI模块间集成性设置 SAP系统财务模块的集团公司处理模式 耶鲁大学校长批判民朝大学 XI Dev. guide SAP Exchange Infrastructure POINTS 认识 ITIL Difference between sap_all and sap_new 企业财务流程: 传统存照 ASAP介绍 概要 SAP财务管理大全 精要 Series 心的强大--朱重八传 摘记 挑水与挖井z
JS 四种定义方式
NextStep-V · 2009-10-14 · via 博客园 - NextStep-V

SAP在技术上渐呈开放之势,项目上用到的技术也就多元起来了。这回涉及到js,有必要再温故一下。
对于技术,应该持有“手中无剑,心中有剑”的 态度,从本质上,从思相上去掌握。这样钻研下去,
一切语言,不过是工具,不过是形态各异矣。
-------------------
JavaScript中定义对象的四种方式

JavaScript 中有四种定义对象的方法:
构造函数方式;原型方式;构造函数、原型混合方式 ;动态原型方式。
除了这四种方法,还有工厂方法来定义对象,但工厂方法非常简单,非正规,不常用。
和 Java 这样的纯面向对象语言相比, JavaScript 更像是函数式语言,其并没有类的概念,盖之以对象定义的概念,而具体创建的对象叫做对象实例

1)构造函数方式定义对象。 这种方式是在构造函数内定义属性和方法。这里举个简单的例子:

function Animal(name){

this.name = name;

this.introduceSelf = function(){

window.alert("I am a " + this.name+"!");

};

}

对象的实例化如下:

var dog = new Animal("dog");

dog. introduceSelf();

当然, 也可以将对象的方法在构造函数外定义,如下所示:

function introduceSelf(){

window.alert("I am a " + this.name+"!");

}

function Animal(name){

this.name = name;

this.introduceSelf = introduceSelf();

}

这种在构造函数内定义所有的属性和方法的方式,使得构造函数相当于 Java 中类的概念。而将方法的具体定义独立地放在构造函数外,会使得对象的定义和方法的定义并不紧密,如果在一个文件中这样的方法和对象定义多的话,就会看起来凌乱许多。

2) 原型方式。 该方式利用对象的 prototype 属性,可以将其看成创建新对象所依赖的原型(关于 prototype 的详细信息,可以百度一下,这方面的资料还是很多的)。这种方式将构造函数做成空构造函数,然后将所有的属性和方法被直接赋予 prototype 属性,还是前面的例子,重写如下:

function Animal(){

}

Animal.prototype.name = "animal";

Animal.prototype.introduceSelf = function(){

window.alert("I am a " + this.name+"!");

};

//对象的实例如下:

var dog = new Animal();

dog.name = "dog";

dog.introductSelf();

这种方式的缺点是显而易见的,就是不能在构造函数中对属性进行赋值操作。还有一点是,对于引用类型的属性(如 Array 实例),实例化的多个对象将共享一个引用。正因为这么多的问题,这种对象定义的方式并不可取。

3) 构造函数、原型混合方式。 这种方式是最为流行的对象定义方式。它结合了构造函数及原型方式。这种方式用构造函数定义对象的所有非函数属性,用原型方式定义对象的函数属性(方法)。重写前面的例子:

function Animal(name){

this.name = name;

}

Animal.prototype.introduceSelf = function(){

window.alert("I am a " + this.name+"!");

};

4) 动态原型方式。 和构造函数、原型混合方式相比,动态原型方式只是在函数属性定义的位置上有所不同。重写前面的例子:

function Animal(name){

this .name = name;

if ( typeof Animal._initialized == 'undefined'){

Animal.prototype.introduceSelf = function (){

window.alert( " I am a " + this .name + " ! " );

};

Animal._initialized = true ;

}

}

其中_initialized是Animal的全局私有属性(JavaScript中没有私有属性的概念,所有的属性都是共有的,但为了表明一些属性的私有特性,人们习惯在属性名前加上“_”。),当第一次实例化Animal时,if条件就为真,这样就会定义Animal中的函数属性。由于“Animal._initialized = true;”的存在,函数的定义调用一次而无论实例化多少个对象。