对象

对象的分类

  • 内建对象
  1. 由ES标准定义的对象,任何ES的实现都可以使用。
  2. 比如:Math、String、Object……
  • 宿主对象
  1. 由JS的运行环境提供的对象,主要是由浏览器提供。
  2. 比如BOM、DOM。
  • 自定义对象

开发人员自己创建的对象。

创建、读取、删除属性、[]、in

var obj = new Object();

obj.name = “孙悟空”;

console.log(obj.name);

  • 如果读取对象没有的属性,则返回undefined。

delete obj.name;

  • 对象属性名不强制要求标识符的规范。

obj[“123”] = “hello”;
console.log(obj[“123”]);

  • 使用[]操作属性,更加灵活。在[]传递一个变量,也会将变量值传为该属性。

n = 123;
consile.log(obj[n]);

  • in运算符,检查是否含有指定属性。

console.log(“name” in obj);

引用数据类型

涉及基本数据类型与引用数据类型。

  • 基本数据类型,在栈内存中存储。

  • 引用数据类型,在堆内存中存储。

  • new表示在堆内存中申请空间。在栈内存中保存对应与堆内存的地址(对象的引用)。

var obj = new Object();
obj name = “Tom”;
var obj2 = obj;

则obj与obj2在栈内存中保存相同地址,指向堆内存中相同空间。

对象字面量

var obj = {};

  • 用{}与new效果一样。
  • 用{}可以直接指定对象中属性。

var obj2 = {name:“阿尼”, age:20};

函数

创建与调用

  • 函数也是一个对象。
  • 函数中可以封装一些功能。

var fun = new Function();

  • 可以将代码以字符串的形式传递给构造函数。但很少使用。

var fun = new Function(“console.log(“Hello”)”);

fun();

  • 使用函数声明来创建函数。

function 函数名([形参1, 形参2, …]){}

var 函数名 = function([形参1, 形参2, …]){}

函数的参数

  • 函数的实参可以是任意的数据类型。

  • 实参也可以是一个对象。当参数过多时,可以把参数封装在对象中。

函数的返回值

  • 使用return设置返回值。
  • return可以返回一个对象。

function sum(a , b , c){
var d = a + b + c;
return d;
}

  • 使用return可以结束整个函数。

立即执行函数

(function(a,b){})(123,456);

方法

obj.sayName = function(){};

  • 函数也可以成为对象的属性,此时为对象的方法。

枚举对象中的属性

for(var n in obj){
console.log(“属性名:”+n);
console.log(obj[n]);
}

2019年7月16日20:27:06:b站上的教学视频av34087791上午还能看,晚上就被取消了。当年学java也是因为课程突然被取消而放弃。现在不是当年。学到P59,改学作用域了。搜索视频号“av34087791”,在CSDN上发现该课程的笔记,把剩下的基础知识补全。

资源:https://blog.csdn.net/ishenjiaming/article/details/86583635

作用域

全局作用域

  • 全局作用域在页面打开时创建,在页面关闭时销毁。

  • 在全局作用域中有一个全局对象window,它代表浏览器的窗口,它由浏览器创建,可以直接使用。

在全局作用域中:

  1. 创建的变量都会作为window对象的属性保存;
  2. 创建的函数都会作为window对象的方法保存。
  • 全局作用域中的变量都是全局变量,在页面的任何部分都可以访问到。

声明变量

使用var声明变量并赋值等于增加一个变量。

使用var声明的变量会在代码执行前被声明(但是不会赋值)。

使用函数生命形式创建的函数function 函数(){},会在代码执行前被创建,因此可以在函数声明前来调用。如果使用函数表达式创建的函数,则不会被声明提前。

函数作用域

调用函数时创建函数作用域,函数执行完毕,作用域销毁。

函数中不使用var声明的新变量,都会成为全局变量。

function test(){var a = 10;
c = 99;
}
test();
console.log©; //输出99
console.log(a); //错误

this

this指代当前对象,如果没有当前对象,则this指window。

  1. 以函数形式调用时,this是window;
  2. 以方法形式调用时,谁调用方法this就是谁;
  3. 以构造函数形式调用时,this是新创建的对象。

使用工厂方法创建对象

可以使用工厂方法大批量创造相同性质的对象,但是不推荐使用。

function createPerson(name, age, gender){
var obj = new Object();
obj.name = name;
return obj;
}

var obj1 = createPerson(“Tom”);
var obj2 = createPerson(“Tim”);

缺点:使用工厂方法创建的对象类型都是object,无法区别不同的对象类型。

使用构造函数创建对象(类)

构造函数习惯上首字母大写,需要关键字new来调用。

function Person(name, age, gender){
this.name = name;
this.sayName = function(){
alert(this.name);
};
}

var per = new Person(“Tom”);
var per = new Person(“Tim”);

instanceof判断类的实例

console.log(per instanceof Person); //“true”

  • 所有对象都是Object的实例。

原型对象创建方法

原型prototype

创建的每一个函数,解析器都会向函数中添加一个属性prototype,这个属性对应着一个对象,即原型对象。

  • 如果函数作为普通函数调用prototype,没有任何作用;
  • 当函数以构造函数的形式调用时,它所创建的对象中都会有一个隐含的属性,指代向该构造函数的原型对象,可以通过__proto__来访问该属性。

function MyClass(){
}
var mc = new MyClass();
console.log(mc.__proto__ == MyClass.prototype); // “true”

  • 向构造函数的原型对象里添加一个属性,那么通过该构造函数创建的对象实例都可以访问到该属性。

MyClass.prototype.a = 123;
var mc = new MyClass();
console.log(mc.a); // “123”

构造函数与方法创建

  • 添加一个方法的正确形式,是将类的方法写到原型对象中。

MyClass.prototype.sayHello = function(){
alert(“Hello”);
};

原型对象与属性

  • 使用对象的hasOwnProperty()来检查自身中是否含有该属性。

console.log(mc.hasOwnProperty(“name”));

  • 原型对象也有原型。

console.log(mc.__proto__.__proto__.hasOwnProperty(“hasOwnProperty”));

  • Object对象的原型没有原型。

对象的toString方法

在页面中打印一个对象时,返回[object Object],实际上调用了对象的toString()方法。

可以修改对象或者原型的toString。

per.toString = function(){return “hello”;};
Person.prototype.toString = function(){return “world”;};

垃圾回收

  • JS中有自动的垃圾回收机制。

  • 将不再使用的对象设置null即可。