什么是面向对象
对象、类、实例
JS本身就是基于面向对象研发出来的编程语言:内置类
数据类型
DOM元素
……
对象:万物皆对象
类:对象的细分
实例:类中具体的事物
=============
JS也是面向对象编程:类、实例
1 ->Number
‘A’ ->String
true ->Boolean
null ->Null ->Object
undefined ->Undefined
[] ->Array
/^$/ ->RegExp
function(){} ->Function
{} ->Object
每一个元素标签(元素对象)都有一个自己所属的大类
div -> HTMLDivElement -> HTMLElement -> Element -> Node -> EventTarget -> Object
每一个实例可以调用所属类(整条链)中的属性和方法
/*
* 创建一个自定义类
* =>创建一个函数(Function类的实例),直接执行就是普通函数,但是“new 执行”它则被称为一个自定义的类
* NEW 函数执行
* 形成一个全新的执行上下文EC
* 形成一个AO变量对象
* ARGUMENTS
* 形参赋值
* 初始化作用域链
* [新]默认创建一个对象,而这个对象就是当前类的实例
* [新]声明其THIS指向,让其指向这个新创建的实例
* 代码执行
* [新]不论其是否写RETURN,都会把新创建的实例返回(特殊点)
*/
练习题
function Dog(name) {
this.name = name;
}
Dog.prototype.bark = function () {
console.log('wangwang');
}
Dog.prototype.sayName = function () {
console.log('my name is ' + this.name);
}
/*
let sanmao = new Dog('三毛');
sanmao.sayName();
sanmao.bark();
*/
function _new() {
//=>完成你的代码
}
let sanmao = _new(Dog, '三毛');
sanmao.bark(); //=>"wangwang"
sanmao.sayName(); //=>"my name is 三毛"
console.log(sanmao instanceof Dog); //=>true
补充代码
<script>
function Dog(name) {
this.name = name;
}
Dog.prototype.bark = function () {
console.log('wangwang');
};
Dog.prototype.sayName = function () {
console.log('my name is ' + this.name);
};
/*
* 内置NEW的实现原理
* @params
* Func:操作的那个类
* ARGS:NEW类的时候传递的实参集合
* @return
* 实例或者自己返回的对象
*/
function _new(Func, ...args) {
//默认创建一个实例对象(而且是属于当前这个类的一个实例)
// let obj = {};
// obj.__proto__ = Func.prototype; //=>IE大部门浏览器中不允许我们直接操作__proto__
//Object.create(proto, [propertiesObject])
//方法创建一个新对象,使用现有的对象来提供新创建的对象的proto。
// proto: 必须。表示新建对象的原型对象,即该参数会被赋值到目标对象(即新对象,或说是最后返回的对象)的原型上。该参数可以是null, 对象, 函数的prototype属性 (创建空的对象时需传null, 否则会抛出TypeError异常)。
let obj = Object.create(Func.prototype);
//也会把类当做普通函数执行
//执行的时候要保证函数中的this指向创建的实例
let result = Func.call(obj, ...args);
//若客户自己返回引用值,则以自己返回的为主,否则返回创建的实例
//因为nall也属于object ,function也是引用类型值
if ((result !== null && typeof result === "object") || (typeof result === "function")) {
return result;
}
return obj;
}
let sanmao = _new(Dog, '三毛');
sanmao.bark(); //=>"wangwang"
sanmao.sayName(); //=>"my name is 三毛"
console.log(sanmao instanceof Dog); //=>true
</script>