WebStudy-对象与面向对象

对象

概述:
ECMA-262把对象定义为:属性的无序集合,为每个属性存放一个原始值、对象或函数,即对象是无特定顺序的值的数组。

通用定义:对象是需求场景中的名词(人,事,物)在程序中的表示。Javascript中除了string,number,boolean,null,undefined之外,其他的数据都是对象,如数组,日期,函数等。

Javascript是面向对象的语言,但与Java,c#等面向对象的语言不通,JS中没有定义类的语法,也不会通过类来创建对象——javascript基于prototype,而不是基于类。

一种面向对象语言需要向开发者提供三种基本能力:
封装——把相关信息(无论数据或方法)存储在对象中的能力
继承——从其他对象为当前对象获取属性和方法的能力
多态——能以多种不同的形式运行函数或方法的能力

ECMAScript中,一个对象可由多个特性(attribute)构成(也称为对象的成员);
每个特性都有名称和值;
若特性的值存放的是原始值或对象的引用,这种特性称为对象的属性(property)——属性描述对象的名词性特征;
若特性的值存放的是函数,这种特性称为对象的方法(method)——方法描述对象的动词性特征;

Object = Property + Method

创建对象

创建对象共有三种方式:

  • 对象直接量
 var emp1={enname:"tom",salary:5000};
        var book={
                bookname:"javascript高级编程",
            'subtitle':"深入javascript",
            'for':"有一定编程基础的人员",
            author:{
                firstname:'ming',
                lastname:'wang'
            }
        };
        console.log(emp1.enname);
        console.log(emp1.salary);
  • 通过new 关键字调用构造方法创建对象
 var emp2=new Object();
        emp2.enname="Mary";
        emp2["salary"]="6000";
  • 通过Object.create(prototype)创建对象——ECMAScript5新增的方法。

访问属性

有多种访问方法,但如果写[]要在里面加""

        console.log(book.bookname);
        console.log(book.author.firstname);
        console.log(book['author']['firstname']);

使用for/in 循环遍历对象的所有属性

for…in 遍历对象的属性并没有特定的顺序;只能遍历出用户自定义的属性,不能枚举出预定义的属性和方法。

    for (var i in book){
        document.write(i+":"+book[i]+"<br>");

    }

检测属性

  • 使用in关键字
 console.log("bookname" in book);
  • 使用对象的hasOwnProperty()方法
console.log(emp2.hasOwnProperty("enname"));
  • 使用undefined判断
console.log(book.bookname==undefined);
  • 在条件语句中判断
if(emp1.enname){    //undefined/null/0空字符串都会自动转换为false
    console.log("ename属性存在");
}

JOSN(Javascript Object Notation)

Javascript对象表示法,原本是Javascript中创建对象的一种语法。
现在,Json已经从javascrip中独立出来,作为一种独立的字符串数据表示法,被java,c#,c++,php等几乎所有主流语言所支持。
Json作为一种轻量级的文本数据交换格式,已被广泛使用存储和交换文本数据领域,作用于xml类似,但比xml更简洁,更快,更容易解析。

Json语法是javascript对象表示语法的子集

  • 数据在名称/值对中
  • 数据由逗号分隔
  • 花括号保存对象
  • 方括号保存数组

Json数据的基本格式是:“名称/值”对 , “salary”:4000 名称应使用双引号引起来,值可以是一下类型:数字,字符串,逻辑值,数字,对象,null。

var json='{"x":50,"y":30}';
var jsonObj=eval("("+json+")");
console.log(jsonObj.x);
console.log(jsonObj.y);
console.log(typeof(jsonObj));
console.log(typeof(jsonObj.x));

使用JSON.parse(string)方法来解析JSON字符串得到javascript对象。

var jsonTxt = '{"x":60,"y":30}';
var jsonObj = JSON.parse(jsonTxt);
console.log(jsonObj.x);
console.log(jsonObj);
console.log(typeof(jsonObj));

使用JSON.stringify(jsonObj)方法把Javascript对象格式化为JSON字符串。

var jsonObj = {
	'x':30,
	'y':60
};
var jsonTxt = JSON.stringify(jsonObj);
console.log(jsonTxt);
console.log(typeof(jsonTxt));

arguments对象

  • arguments属性是一个类数组对象,每个Function对象具有该属性
  • arguments属性只有在函数执行体内才有效,从中可以对当前函数接收的所有实际参数
  • 可以使用arguments属性处理可变数量的参数
  • arguments对象具有如下属性:
    • length: 返回实际传入的参数的个数
    • callee: 返回当前函数的引用(匿名函数可以使用该属性实现递归调用)

面向对象

万物皆对象

Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象。但是,它又不是一种真正的面向对象的编程(OOP)语言,因为它的语法中没有class类。

什么是面向对象?
你通过观察生活当中的实际存在的某一个事物,通过些许数据将整个实际存在的事物抽象到计算机当中存储起来。
面:你通过看
向:方向
对象:世间万物解释对象
抽象:使用计算机当中某些方法和属性

函数定义:
怎么定义Javascript当中的函数(三种定义方式)

第一种定义方式(一般方式,最简单,最直接)

function add(){
}

第二种定义方式(构造函数法,Javascript中没有类的概念,Fuction是一个对象)

var add=new Fuction();

第三种定义方式(直接量方式,定义变量接受)

var add=fuction(){
}

构造函数并实例化的书写步骤:
1.先构造一个对象(设置好参数的个数)。
2.根据参数的个数来书写该对象的属性 this指代构造的对象
3.书写该对象的方法
4.通过关键字 new来实例化该对象并传递与参数个数相同的值
5.将实例化后的对象赋给一个变量
6.输出该变量即可。
写构造的意义是什么?
将复杂重复属性的代码简洁化处理,让代码执行更加的快捷高效。

函数重载(arguments对象)
java当中函数重载(函数名相同,函数的参数个数不同)
eg:

public void add(String username,String password){
}

public void add(String username){
}

Javascript函数重载

fuction add(a,b){
return a+b;
}
function add(a,b,c){
return a+b+c;
}
console.log(add(1,2)); //output NaN
console.log(add(1,2,3)); //output 6

说明:
Javascript中没有真正意义上的函数重载。
函数重载
函数名相同,函数的参数列表不同(包括参数个数和参数类型),根据参数的不同去执行不同的操作。

几种特殊的函数

1.普通函数

function aDd(a,b){
    return a+b;
}

2.匿名函数

 function(a,b){
    return a+b;
     }

匿名函数的作用:
1.可以将匿名函数作为参数传递给其他函数,接收方就能够利用所传递的函数来完成某些特定的事情。
2.可以定义某个匿名函数来完成某一次性的任务。

3.回调函数

function fn(a,b){
    return a()+b();

}
var one=function(){return 1;}
var two=function(){return 2;}
console.log(fn(one,two));
console.log(fn(function(){return 3;},function(){return 4;}))

one two 对于fn来说就是一个参数,函数one和two就是回调函数
将一个函数作为一个参数传递给另一个函数,作为参数的函数就是回调函数。

回调函数有助于提升性能
匿名回调函数的优点:
1.可以在不做命名的情况下传递函数(意味着可以节省全局变量)
2.可以将一个函数调用操作委托给另外一个函数(意味着可以节省一些代码编写工作)

4.自调函数
自调函数就是在定义函数后自行调用:

(function(){
    console.log("javascript");
})();
1+(function(){
    console.log("javascript");
})()

第一个括号:放置的是一个匿名函数。
第二个括号的作用:立即调用。
自调函数只需:将匿名函数放在第一对括号当中,然后再加一对括号即可。

注意: 在一个<script></script>标签中写多个自调函数的时候,一定要注意要不然就是在第二个()立即调用之后写上 注意语法的规范
要不然就是在函数前写一个 1+ 要不然会出现报错的现象。

自调函数传递参数:

(function(str){
    console.log(str)
})("朴宰范")

5.内部(私有)函数

在函数内部定义的函数。

function fn(){
    var a="a"
    function fn1(input){
        var b="b";
        return b;
    }
    return fn1();
}
console.log(fn()) // b
//console.log(fn1()) // undefined fn1 is not defined 内部函数的私有性,内部函数自定义不调用没意义

返回函数的函数,是内部私有函数的一种特殊用法:

function fnn(){
    var a="a";
    return function(){
        return a;
    }

}

console.log(fnn()); //output ƒ (){ return a}
var fun=fnn();
console.log(fun());//output  a
console.log(fnn()()); //output a 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值