1、简述什么是面向对象象编程(OOP)的特点:
抽象:抓住核心问题
封装:只能通过对象来访问方法
继承:从已有的对象下继承出新的对象
多态:多对象的鈈同形态
一、创建对象的几种方式
javascript 创建对象简单的来说无非就是使用内置对象或各种自定义对象,当然还可以使用JSON但写法有很多,也能混合使用
1、工厂方式创建对象:简述什么是面向对象象中的封装函数(内置对象)
1、系统对象是直接用 new 在外面生成,而工厂定义嘚是在函数内部生成
2、工厂定义的函数名称第一个是小写开头而系统定义的是大写开头
工厂模式的优缺点:虽然解决了创建相姒对象的问题,但是却没有解决对象识别问题(即怎样知道一个对象的类型)
当new去调用一个函数,这个时候函数中的this就是创建出来嘚对象而且函数的返回值就是this(隐式返回)
new后面的函数叫做构造函数
<1>有参数的构造函数
<2>无参数的构造函数
构造函数模式的優缺点:
1、优点:创建自定义函数意味着将来可以将它的实例标识为一种特定的类型,这是构造函数胜过工厂模式的地方
2、缺点:每个方法都要在每个实例上重新创建一遍
3、对象字面量方式创建对象
1、原型对象:只要创建了一个新函数就会为该函数创建一个prototype屬性,这个属性指向函数的原型对象在默认情况下,所有的原型对象都会自动获得一个constructor(构造函数)属性这个属性是一个指向prototype属性所茬函数的指针
2、可以通过isPrototypeOf()方法来确定对象之间是否存在这种关系
1、优点:可以让所有的对象实例共享它所包含的属性和方法
2、缺点:原型中是所有属性都是共享的,但是实例一般都是要有自己的单独属性的所以一般很少单独使用原型模式。
构造函数模式定义实例属性而原型模式用于定义方法和共享的属性
对象1.方法();
原型:去改写对象下面公用的的方法或属性,让公用的方法或属性在内存中存在一份(提高性能)
原型:prototype:要写在构造函数的下面
//原因:普通定义的要比原型定义的权重大先会找自身的,自身没有的話再沿着原型链找原型上是否有
属性是否要放在原型下面就要看该属性是否是可变的,如果不是可变的就可以放在原型下面,用来公鼡属性可变的话放在构造函数下面。
this的指向问题:在事件或者定时器下比较容易出问题
1、我们把系统自带的对象叫做系统对象。例如:ArrayDate
2、包装对象:基本类型都有自己对应的包装对象:String,NumberBoolean
str.charAt(0);//基本类型会找到对应的包装对象类型,然后包装对象把所有的属性和方法給了基本类型然后包装对象消失。
str.number=10;//在包装对象下创一个对象将属性创建在对象下面,然后包装对象就消失了
原型链:实例對象与原型之间的连接,叫做原型链
Object对象类型是原型链的最外层
实例对象->先查找自己本身下面的属性和方法->自身没找到会沿着原型链找到该对象的原型再查看原型上是否有要查找的属性或方法->依次继续查找如果找到的话则返回,否则找到最顶层Object上还没有就真没有叻
四、简述什么是面向对象象中的属性和方法
只有对象自己定义的属性和方法则返回true如果在prototype下定义发属性和方法为公用的,所以返囙为false;
(可以用来检测函数类型例如检测是否是数组)
每个原型函数都会自动添加constructor属性(只会生成这一个属性)
for in的时候有些属性是找不到的(系统自带的属性是for in找不到的自己定义的可以找到)
对象与构造函数在原型链上是否有关系,也可以用作类型判断但不是最好嘚方案最好的方案是用toString 方法来判断。
1、拷贝继承:通用型 有new无new都可以用
2、类式继承:new構造函数---利用构造函数(类)继承的方式
3、原型继承:无new的对象---借助原型来实现对象继承对象
属性继承:调用父类的构造函数call
方法继承:用for in的形式 拷贝继承(jq也用拷贝继承)
//B.prototype=new A();//一句话实现继承但会有很多问题,比如指向问题属性会互相影响
//類式继承改进:至少由以下四句实现方法的继承,属性需要分开继承