面向对象编程:Object Oriented Programming,简称OOP。

典型的oop语言,如hava、c++,存在着的概念,类就是对象的模板
可以类比人类;而实例化类后变为对象,对象可以类比男人;其实男人还可以作为一个类小明是男人这个类的实例化对象
而在JavaScript语言中,构造函数充当着对象的模板作用
JavaScript对象体系,是基于“构造函数”(constructor)“原型对象”(prototype)的,不是基于类
 

使用构造函数和new示例:

 var O1=function(){
this.name='apple';
};
/**
* 1.函数名一般大写进行区分;构造函数内部使用了this关键字
* 2.生成对象,使用new
*/
var o2=new O1();
console.log(typeof o2,o2); function O2(){
this.name='microsoft';
}
var o3=new O2();
console.log(typeof o3,o2);
console.log('---');

运行结果:

构造函数也可以带参数:

 var Apple=function(){
this.weight=100;
};
var a=new Apple();//相当于var a=new Apple;
console.log(a.weight);
var Apple1=function(weight){
this.weight=weight;
}
var a1=new Apple1(10);
console.log(a1.weight);

如果构造函数未带参数,那么使用new命令时,可以省略()。

运行结果:

如果没有使用new命令调用构造函数:那么this指向全局对象或者说是顶层对象(即window)

 function Blue(){
this.money=1000;
}
var b1=new Blue();
var b2=Blue();//window.money
console.log(b1,b2);
console.log(b1.money,window.money,money);

运行结果:(b2:undefined)

为了避免出现不加new调用构造函数的情况:1.使用严格模式;2.构造函数内部对this的指向进行判断

 //避免出现不加new情况,使用'use strict';
//在严格模式下,函数内部this不允许指向全局对象window,默认等于undefined
function Cat(){
'use strict';
this.color='white';
}
//var c1=Cat();//报错,不能将属性color添加给undefined function Dog(){
//如果this不指向当前对象Dog,那么使用new生成实例对象
if(!(this instanceof Dog)){
return new Dog();
}
this.name='xiaoming';
}
var d1=Dog();
console.log(d1);
var d2=new Dog();
console.log(d2);

运行结果:

构造函数中存在return语句ruturn对象,那么new 返回return的这个对象否则return无效,返回this

 console.log('---');
function Ele(){
this.name='nicai';
return 100;
}
var e1=new Ele();
console.log(e1); function Ele1(){
this.name='apple';
return {
name:'blue',
calss:'super calss'
};
}
var e2=new Ele1();
console.log(e2);
console.log(e2.name);//blue

运行结果:

普通函数使用new调用:生成空对象

//注意与普通函数进行区分;普通函数:内部没有this关键字、函数名一般以小写开头
function fire(){
var s='this is a test function';
return s;
}
var f1=new fire();
console.log(f1,typeof f1);

运行结果:

new.target属性:

 //函数内部使用new.target属性。如果函数被new调用,则new.target等于当前函数;否则,new.target等于undefined

 function Gird(){
this.name='gird';
console.log(new.target===Gird);
}
var g1=new Gird();//true
var g2=Gird();//false

运行结果:

参考:阮一峰标准参考教程

JavaScript OOP(一)之构造函数与new命令的更多相关文章

  1. Javascript中构造函数与new命令

    典型的面向对象编程语言(比如C++和Java),存在“类”(class)这个概念.所谓“类”就是对象的模板,对象就是“类”的实例.但是,在JavaScript语言的对象体系,不是基于“类”的,而是基于 ...

  2. Javascript中构造函数与new命令2

    典型的面向对象编程语言(比如C++和Java),存在"类"(class)这个概念.所谓"类"就是对象的模板,对象就是"类"的实例.但是,在J ...

  3. 玩转JavaScript OOP[2]——类的实现

    概述 当我们在谈论面向对象编程时,我们在谈论什么?我们首先谈论的是一些概念:对象.类.封装.继承.多态.对象和类是面向对象的基础,封装.继承和多态是面向对象编程的三大特性. JavaScript提供了 ...

  4. JavaScript OOP 之 this指向

    今天给大家分享一个JavaScript OOP中关于分辨this指向对象的小技巧,很实用呦! 我们先来看一段代码: 大家能判断出func();和obj.func();这两句的this指向吗? 首先,我 ...

  5. 使用JavaScript OOP特性搭建Web应用

    最近,我面试了一个有五年 Web 应用程序开发经验的软件开发人员.四年半来她一直在从事 JavaScript 相关的工作,她自认为 JavaScript 技能非常好,但在不久之后我就发现实际上她对 J ...

  6. 玩转JavaScript OOP[3]——彻底理解继承和原型链

    概述 上一篇我们介绍了通过构造函数和原型可以实现JavaScript中的“类”,由于构造函数和函数的原型都是对象,所以JavaScript的“类”本质上也是对象.这一篇我们将介绍JavaScript中 ...

  7. javascript继承之借用构造函数与原型

    javascript继承之借用构造函数与原型 在js中,关于继承只有利用构造函数和原型链两种来现实.以前所见到的种种方法与模式,只不过是变种罢了. 借用构造函数 1 2 3 4 5 6 7 8 9 1 ...

  8. (二)Javascript面向对象编程:构造函数的继承

    Javascript面向对象编程:构造函数的继承   这个系列的第一部分,主要介绍了如何"封装"数据和方法,以及如何从原型对象生成实例. 今天要介绍的是,对象之间的"继承 ...

  9. javascript创建对象的方法--构造函数模式

    javascript创建对象的方法--构造函数模式 一.总结 构造函数模式作用和不足 1.作用:解决工厂模式不是用new关键字来创建对象的弊端 2.作用:解决工厂模式创建的实例和模型没有内在联系的问题 ...

随机推荐

  1. SpringMVC 基本概念

    DispatcherServlet:前端控制器,解释用户请求,通过HandlerMapping查找对应Handler处理请求,调用ViewResolve回填页面,DispatcherServlet在W ...

  2. PHP二分查找算法

    思路:递归算法.在一个已经排好序的数组中查找某一个数值,每一次都先跟数组的中间元素进行比较,若相等则返回中间元素的位置,若小于中间元素,则在数组中小于中间元素的部分查找,若大于中间元素,则在数组中大于 ...

  3. json格式转化成map

    public static Map<String, Object> parseJSON2Map(String jsonStr) { Map<String, Object> ma ...

  4. HTML5须知十件事

    英文原文:10 things you should know about HTML5 一两年前,HTML5似乎还是一个模糊的概念,只有少数几个互联网的书呆子才会关心.而现在,却感觉仿佛HTML5无所不 ...

  5. Android中的intent属性

    android之Intent的七大属性 2015年04月03日 ⁄ Android ⁄ 共 14866字 ⁄ 字号 小 中 大 ⁄ 1条评论 Intent用于封装程序的“调用意图”.两个Activit ...

  6. Zernike不变矩

    1.Zernike矩介绍 Zernike矩是基于 Zernike多项式的正交化函数,所利用的正交多项式集是 1个在单位圆内的完备正交集.Zernike矩是复数矩 ,一般把 Zernike矩的模作为特征 ...

  7. Spring AOP分析(2) -- JdkDynamicAopProxy实现AOP

    上文介绍了代理类是由默认AOP代理工厂DefaultAopProxyFactory中createAopProxy方法产生的.如果代理对象是接口类型,则生成JdkDynamicAopProxy代理:否则 ...

  8. vConsole--针对手机网页的前端 console 调试面板。

    一个针对手机网页的前端 console 调试面板. 简介 vConsole 是一个网页前端调试面板,专为手机 web 页面量身设计,帮助开发者更为便捷地进行开发调试工作. 手机预览 http://we ...

  9. 一个简单的MVC框架的实现-基于注解的实现

    1.@Action注解声明 package com.togogo.webtoservice.annotations; import java.lang.annotation.Documented; i ...

  10. 使用 ConfigSource 特性 拆分 Web.config 文件

    一个大项目里可能会有非常多个配置参数,有.Net自己支持的配置(比如WCF,AppSettings),还有一部分是自定义的配置(比如继承自ConfigurationSection和Configurat ...