面向对象(js)

1.什么是对象
对象就是无序的键值对儿的集合。

JavaScript中 万物皆对象。
凡是对象都有自己的属性和方法。
所有的对象都是可以new
凡是通过new 关键字得出的对象都叫做实例对象。
var str = new String("abcde");
var num1 = new Number("123")

2 創建對象的方法
1.字面量
2.new Object()
3.自定義構造函數
4.Object.create() es2015新增方法
5.工厂函数

3 工廠函數:批量生產對象
栗子:function createStudent(name,age,className) {
var obj = new Object();
obj.name = name;
obj.age = age;
obj.className = className;
obj.study = function () {
console.log("學習Css")
}
return obj;
}

优点:直接调用 可以生成对象 createStudent()
工廠函數的弊端:每次調用工廠函數,都在內存中開闢空間
所有的函數也同樣重新生成,導致內存浪費。

4.自定义构造函数的由来
工廠函數有內存浪費的問題,為了解決內存浪費的問題,就有了自定義構造函數。

5.自定義构造函数 :作用就批量生產對象
規定:首字母大寫
function Dog(name,age,color){
this.name = name;
this.age = age;
this.color = color;
this.say = function(){
console.log("hello")
}
}
var damao = new Dog("大毛",12,"yelow")
new 自定義構造函數
內存中發生了什麼事情?
1.在内存中开辟空间创建了一个新的对象。this就指向了这个对象。
2.把构造函数中所有的属性和方法,全都复制一份给了新的对象
3.每个构造函数都有原型对象,新的对像也继承了所有原型对象
中的属性和方法。


自定义构造函数,优点是,避免每次创建对象,都在内存中开辟空间
生成同样的函数。节省内存。


6.常用的内置对象 也就構造函數 内置内
Number String Boolean
Array Date Math RegExp
Function Object
Global Error

7.什么是面向对象
面向对象是一个思想,就是把解决问题的注意力集中到对象上。

面向对象有三大特点 :封装 继承 多态
封装:把所有相关的属性和方法封装在一个对象里。
继承:自己没有的属性或者方法,把别人的拿来用。
多态:不同的对象根据事件情况,执行代码不同。
js可以模拟实现。arguments。
8.原型对象
把相同的属性和方法写在构造函数的原型对象里。
构造函数的实例对象 new 出来的实例就全部可以访问。
原型对象存在的最大作用就是节省内存空间
9.原型链
***原型链:由各级对象的__proto__逐级继承形成的关系

原型链的作用也是节省空间。
实现:
1建立一个基础对象的构造函数,再建立一个继承对象的构造函数,
2然后用prototype实现对象的继承。



原型继承
10.模拟继承 call apply bind
模拟继承实际上就是执行了一个函数,把this执行改变成了当前构造函数的实例对象
并没有节省内存空间。
栗子
function Person(name,age) {
this.name = name;
this.age = age;

}
Person.prototype = {
say : function () {
console.log("hello,I'm" + this.name)
}
}

function Student(name,age,studyObj) {
模拟继承
Person.apply(this,arguments);
相当于
this.name = name;
this.age = age;
}

11.完整的原型链的验证
// Person的原型对象的__proto__
console.log(Person.prototype.__proto__ === Object.prototype)

// 构造函数Person是Function的实例对象
console.log(Person.__proto__ === Function.prototype)

// 构造函数Function的原型对象是Object的实例对象
console.log(Function.prototype.__proto__ === Object.prototype)

// Object构造函数是Function的实例。
console.log(Object.__proto__ === Function.prototype)

// 构造函数Function 是它自己的实例对象
console.log(Function.__proto__ === Function.prototype)

// 零散
console.log(Object.prototype.__proto__ === null)
// 任意对象都是Object的实例
var o = {}
console.log(o.__proto__ === Object.prototype)
// 任意的函数都是Function的实例对象
var f = function () { }
console.log(f.__proto__ === Function.prototype)

12.经典继承
Object.create()
var xiaohei = Object.create(cat)
xiaohei的原型对象就是cat
console.log(xiaohei.__proto__ == cat)
var duolaBmeng = Object.create(cat,{
name:{ value : "多啦B梦"},
eat :{ value : function () {
console.log("我爱吃陀螺烧")
}}
})
13.混入式继承
function extend(obj1,obj2){
for(var k in obj2){
obj1[k] = obj2[k]
}
}

14.给内置对象(构造函数)扩展方法。
if(!Object.prototype.extend){
Object.prototype.extend = function(obj2){
for(var k in obj2){
this[k] = obj2[k];
}
}
}
但是,为了避免冲突,给内置对象(构造函数)扩展方法尽量少用。
所以如果公司团队内部需要扩展,一定商量好,避免冲突


15.给String Array 内置构造扩展方法

 

 

猜你喜欢

转载自www.cnblogs.com/yryx/p/11361846.html