面向对象以及相关知识

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值