1.什么是对象?
(1)只要是对象就可以有自己的私有属性。
例如:
let obj = new Object(); obj.name = 'lee'; 我们这里obj这个对象有自己的私有属性,私有属性就是name
let str = 'abc'; str.name = 'efg'; console.log(str.name); // undefined 因为str是字符串不是对象 所以没有自己的私有属性
let strObj = new String('abc');strObj.name = 'efg'; console.log(strObj.name); // efg strObj是new出来的 是对象 所以有自己的私有属性
(2)只要是new 出来的都是对象。
例如:new Array()、new Object()、new Number()、new String()、function Leo() {}; new Leo();
(3)不同对象肯定不会相等的。
例如:
let first = {};
let second = {};
first == second // false
同理:
let arrOne = [];
let arrTwo = [];
arrOne == arrTwo; // false
分割线~~~~
let one = new Number(1);
let two = new Number(1);
one == two; // false
分割线~~~~
如果想让他们相等
let one = new Array(1);
let two = one;
one == two; // true
如果one.push(2); two里也会有2 反之 如果two.push(3); one数组里也有3 这是因为对象的引用机制 是它们指向了相同的内存空间
(4)对象都会有引用机制。如果不想引用就重新赋值
例如:
let obj = {name: 'lee'};
let another = obj;
obj = {name: 'Alice'};
obj == another; // false 这里obj的name是Alice, another的name是lee
2.程序员主动回收:
(1)赋值为null (2)delete删除属性
let num = 123;
num = null; // num被回收掉
console.log(num); // null
let obj = {age: 24};
如果想删除掉obj的age属性值 使用delete
delete obj.age;(delete只用于删除对象的属性,不可以删除对象本身
例如不可以delete obj 这样执行完之后,obj以及它上面的属性还是存在)
console.log(obj); // {}
我们这里尝试清除js定义好的类
String = null;
let str = new String('abc'); // Uncaught TypeError: String is not a constructor
Number = Boolean = Object = null;
let num = new Number(12); // Uncaught TypeError: Number is not a constructor
依次类推,new Boolean、Object都会报相应错误
window会例外
window = null;
console.log(window); // window对象
3.javascript数据类型:undefined、null、Boolean、String、Number、Object、Symbol(共7种)
基本数据类型: undefined、null、Boolean、String、Number(5种)
4.this指向
(1)在普通函数下 this 指向的是window。
例:
function sum() {
console.log(this); // window
};
sum();
(2)有事件源指向事件源本身。
例:
document.onclick = function() {
console.log(this); // 触发点击事件,this指向document
}
(3)在定时器下this指向window,除了es6。 es6中箭头函数this指向父级
例:
let obj = {calc: function() {setTimeout(function() {console.log(this)}, 0)}};
obj.calc(); // window
let another = {calc: function() {setTimeout(() => {console.log(this)}, 0)}};
another.calc(); // another对象本身输出 {calc:f}
(4)在对象下this指向的是对象本身。
let obj = {
calc: function() {console.log(this.age)},
age: 24
};
obj.calc(); // 24
5.面向对象
地球上有生物,生物又分为人类、植物类、微生物类等等 人类具备的技能:洗衣、做饭、伐木等
浏览器-Object又分为string、boolean、number等 string具备的方法:substring、indexOf、slice等
这里的类指的就是string、boolean、number等
原型:类string、boolean、number等的prototype 例如string的substring就是在原型上的
原型链: 继承 例如:Object上的toString方法其下面的string、boolean、number等类都有 也就是说string、boolean、number等类可以继承Object,但是Object不可以继承他们下面的string、boolean、number等类。
除了这些js本身提供的类之外,我们也可以自定义类,自定义的类也可以继承。
自定义类
例:
function Loader() {
this.value = 'abc'
};
Loader.prototype.name = 'loaders';
function Sum() {
}
Sum.prototype = new Loader(); //(这里sum的原型上继承了Loader)
console.log(new Sum().value); // 输出abc
console.log(new Sum().name); // 输出loaders
分割线~~~~
这里建议写法: Sum.prototype = new Loader(); //原型和属性都被继承 并且互相不会影响。例如 Sum.prototype.age = 24;Loader.prototype上不会新增age属性。完全没受到影响。反之,如果Loader上新增了一个属性,则会被Sum继承。例:Loader.prototype.sex = '男';console.log(Sum.prototype.sex); // 男
不建议写法:Sum.prototype = Loader.prototype; // 如果这样写给Sum原型链上加上一个属性并且赋值,Loader的原型链上也会有,这是因为对象的引用机制。Sum.prototype.age = 24;console.log(Loader.prototype.age); // 24 反之,Loader.prototype.sex = '男';console.log(Sum.prototype.age); // 男。这种写法下console.log(new Sum().name); // loaders console.log(new Sum().value); // undefined
继承方法:call、apply
call:改变this指向,并且调用一次这个函数,从第二个参数开始对应调用函数的形参
apply: 改变this指向,第二个参数是个对象数组,数组的参数对应调用函数形参
例:
function Loader(year,month) {
this.value = 'abc';
console.log(`今年是${year}年${month}月`);
};
Loader.prototype.name = 'loaders';
function Sum() {
Loader.call(this, 2019, 05); // 改变Loader的this指针 使其指向Sum 输出今年是2019年5月
}
console.log(new Sum().value); // abc
console.log(new Sum().name); // undefined
function Add() {
Loader.apply(this,[2019, 05]); // 改变Loader的this指针 使其指向Sum 输出今年是2019年5月
}
console.log(new Add().value); // abc