面向对象 常用知识点

1.知识点汇聚

1.1  面向对象的程序设计常用概念

对象(名词):是指“事物”在程序设计语言中的表现形式。是JavaScript的一个基本数据类型,是一种复合值,它将很多值(原始值或者其他对象)聚合在一起,可通过名字访问这些值。即属性的无序集合。

类:实际上就是对象的设计蓝图或制作配方。类更多的是一种模板,而对象就是在这些模版的基础上被创建出来的,就是用于构造对象的fn。

封装:主要阐述对象中包含的内容,方便复用。

聚合:将几个现有对象合并成一个新对象的过程

继承:实现代码重用,提高效率,提升代码清晰度,便于维护。

多态:不同对象通过相同的方法调用来实现各自行为的能力,通过把过程化的条件分支语句转化为对象的多态性,从而 消除这些条件分支语句

1.2 js 数据类型    五种基本数据类型(Number,String,Boolean,Undefined,Null),和一种复杂数据类型(Object)。

typeof  可能的取值:"number"    "string"     "boolean"    "undefined"    "object"   "function"    ( 包装类对象   &&  对象与函数之间关系    &&  js 自身特点 )  

typeof 1    "number"
typeof '1'     "string"
typeof true      "boolean"

typeof a      "undefined"

typeof null      "object"

typeof function(){}     "function"

typeof Infinity // number
typeof NaN // number

1.3 惰性求值     ||    与   &&

true || "something" //true        ( 兼容语句 )

true && "something" //"something"  ( 短路语句 )

1.4 函数

1.4.1  函数参数    -   arguments

function sumOnSteroids(){ var i,res = 0; for(i = 0; i < arguments.length; i++){ res += arguments[i]; } return res; }

sumOnSteroids(1,2,3,4,5,6); //21

1.4.2  函数的作用域   -    声明提升  (ao  &&  go)

var a = 123;

function f(){ alert(a); //undefined 这是因为函数域优先于全局域

var a = 1; alert(a); //1

}

f();

1.4.3  回调函数

A(a,b,c,B)

1.4.5 立即执行函数   -  适于执行一些一次性的或者初始化的任务

(function(name){
alert('Hello '+name+' !');
})('Jesse')

1.4.6  内部函数

function a(param){

function _b(theinput){

//私有函数

return theinput * 2

};

return 'The result is '+_b(param)

}

1.4.7  调用自身  -  重定义自身

function a(){
alert('A'); //第一次调用该函数时该语句会被执行
a = function(){ //第一次调用时a被赋予新函数
alert('B'); //第二次/往后 调用该函数时该语句会被执行
};
}

1.4.8 词法作用域   -   即函数自身定义时形成的作用域

function f1(){var a = 1;f2();}
function f2(){return a;} //f2()被定义时a是不可见的,只能访问自身作用域和全局作用域
f1(); //a is not defined

1.4.9  闭包突破函数作用域

function f(){

var b = "m";

return function(){

//有着私有作用域,可以访问f()的作用域和全局作用域

return b;

}

}

var n = f();

n(); //m

1.4.10 循环中的闭包

function f(){ var a = []; for(var i = 0; i < 3; i++){ a[i] = (function(x){ return function(){ return x; } })(i); } return a; } var s = f(); s[0](); //0 s[1](); //1 s[2](); //2

1.5 对象

1.5.1 对象基本知识

在javascript中我们用数组表示索引型数组,用对象表示关联型数组

一般通过以下两种方式访问对象的属性:

中括号表示法:hero['name']
点号表示法:hero.name

构造器属性实际上是一个指向用于创建该对象的构造器函数的引用       hero.contructor //Hero

通过instanceof操作符,我们可以测试一个对象是不是由某个指定的构造器函数所创建的  hero instanceof Hero; //true

1.5.2 内建对象

Object

所有对象都继承自Object对象,因此都具有toLocaleString()、toString()和valueOf()方法

由于alert()要接收字符串参数,所以它会在后台调用toString()方法

Array
Function

定义函数的三种方式

function sum(a,b){return a + b;}; //函数声明
var sum = function(a,b){return a + b;}; //函数表达式
var sum = new Function('a','b','return a + b;'); //Function构造器 避免使用

Function对象的属性:
prototype属性  指向函数的原型对象 ,并最终返回到 null 境界
length:用于记录该函数所拥有的参数数量 ( 形参,函数定义时参数个数 )
caller:返回一个调用该函数对象的外层函数引用  (  arguments.callee  也可以做到 ,arguments.callee.length,arguments.length  分别指代 函数形参和实参长度)

function A(a,b){  return A.caller;}

function B(){return A();}

B();//function B(){return A();}

function A(a,b){ console.log(arguments.callee.length,arguments.length); }

A(1)   //  2  1

Function对象的方法

call()、apply()方法都能让对象去借用其他对象中的方法为己所用,这也是一种代码重用的方式,也是一种继承的实现方式,虽然是治标不治本。

var someObj = {

name: 'Ninja',

say: function(who){ return 'Hello '+who+', my name is '+ this.name; }

};

var myObj = { name:'Jesse' };

someObj.say.call(myObj, 'Dude');

//"Hello Dude, my name is Jesse"

//  apply()的工作方式与call()基本相同,唯一的不同之处在于第二个参数的传递形式apply()方法的第二个参数是通过一个数组来传递

arguments对象

在函数中通过arguments访问传递给函数的所有参数
arguments对象的callee属性,该属性返回的是当前被调用的函数对象
通过arguments.callee属性实现匿名函数的递归调用

(function(count){
if(count < 5){
console.log(count);
arguments.callee(++count);
}
})(1) //1,2,3,4

Boolean

var b = new Boolean();     //   ==  false

Number

 var n =new Number(255);

n.toString(16); // 'ff'

String
 Math

既不能当做一般函数来使用,也不能用new操作符创建对象,只是一个包含一系列方法和属性的内建对象

 Date

RegExp

global:如果该值为false(默认),相关搜索在找到第一个匹配位置时就会停止,如果为true则会找出所有匹配位置,简写为‘g’
ignoreCase:设置是否忽略大小写,默认为false,简写为'i'
multiline:设置是否跨行搜索,默认为false,简写为'm'
lastIndex:搜索开始的索引位置,默认为0。在对象创建之后可以修改
source:用于存储正则表达式匹配模式

RegExp对象的方法

test():返回的是一个布尔值(找到匹配内容为true,否则为false)
exec():返回的是一个由匹配字符串组成的数组

/j.*t/i.test('Javascript')    //true

/j.*t/i.exec('Javascript')[0]    //Javascript

十六进制值转为颜色函数getRGB()

function getRGB(hex){
var rgb=[0,0,0];
if(/#(..)(..)(..)/g.test(hex)){
rgb=[parseInt(RegExp.$1,16),parseInt(RegExp.$2,16),parseInt(RegExp.$3,16)];
};
return "rgb("+rgb.join(",")+")";
}
getRGB('#00ff00'); //"rgb(0,255,0)"

以正则表达式为参数的字符串方法

match():返回的是一个包含匹配内容的数组
search():返回的是第一个匹配内容所在的位置
replace():将匹配的文本替换成指定的字符串
split():根据指定的正则表达式将目标字符串分割成若干数组元素

var s = new String('HelloJavascriptWorld');
s.match(/j.*a/ig); //['Java']
s.search(/j.*a/i); //5
//当某个匹配对象被找到时,如果我们想让相关的替换字符串中包含匹配的文本,可以使用$&修饰符
s.replace(/[A-Z]/g,'_$&'); //"_Hello_Javascript_World"
//如果正则表达式分了组(即带括号),那么可以用$1代表匹配分组中的第一组,$2代表第二组
s.replace(/[A-Z]/g,'_$1'); //"_Hello_Javascript_World"
var csv = 'one, two,three ,four';
csv.split(/s*,s*/) //["one", "two", "three", "four"]
// s*匹配0个或多个空格
//以上的4个方法可以接受的参数也包括字符串
"test".replace('t','r'); //"rest"

Error对象

try{

//可能会导致错误的代码

}catch(e){

//在发生错误时处理代码

}finally{

//可选的

//无论如何都会执行的代码

}

在String()构造器不存在时,自定义MyString()构造器函数
function MyString(string){
    //this.length = 
    this.toString = function(){
        return string.toString();
    }
    this.valueOf = function(){
        return string.valueOf();
    }
    this.reverse = function(){
        return Array.prototype.reverse.apply(string.split('')).join('');
    }
}
var s = new MyString('hello');
s.length;  //5
s[0]; //'h'
s.toString(); //'hello'
s.valueOf(); //'hello'
s.chatAt(1); //'e'
s.concat(' world!'); //'hello world!'
s.slice(0,-1); //'hell'
s.split('l'); //['he','','o']
View Code

1.6 原型

2.相关文章

面向对象编程指南

原文地址:https://www.cnblogs.com/justSmile2/p/10600880.html