浅谈面向对象和继承

1.面向对象和面向过程的区别

  面向过程:注重代码的过程

  面向对象:注重代码的结果

2.面向对象三大特性

  抽象   封装  继承  多态(JS不存在多态)

3.什么是一个构造函数

  new 一个关键字函数  创建一个对象,该对象的的属性this指向window 函数里面指向这个对象

  构造函数和普通函数的区别 :

    1、前者的this的指向是实例化后的对象 后者的指向是指向window

    2、普通函数返回值需要加return 构造函数不需要因为返回的是自己本身

  为什么构造函数没有return却能够有返回值呢?
      因为构造函数在调用的时候系统内部 自动return出了一个this,而这个this就是指的这个对象

这是就不得不说下this的指向问题了

this的指向调用它的对象(可以通过bind/apply/call来改变this的指向)

1.严格模式下this的指向为undefined
2.一个对象 属性this指向window 方法里面的指向为这个对象

3.异步事件this的指向为调用它的对象
  计时器为window
  ajax也为window
4.箭头函数中的this
  此时的 this继承自obj, 指的是定义它的对象obj(也可以理解为它外层的指向就是它的指向)
, 而不是 window,里面只要还是箭头函数就一直是obj 而不是window 如若不是则是window(会继承下来)

var obj={
    say:function(){
        un=()=>{
            console.log(this)  //obj
            cn=function(){
                console.log(this)//window
            }
            cn()
            dn=()=>{
                console.log(this) //obj
            }
            dn()
        }
        un()
    }
}
obj.say()
var obj={
    say:function(){
        setTimeout(()=>{
    console.log(this) //obj
  });
        (function(){
            console.log(this) //window
        })()
        setTimeout(function(){
            console.log(this) //window
}) } } obj.say()

这里要注意输出顺序函数声明提升


5.箭头函数和普通函数混用
  

var obj = {
  say: function () {     console.log(this) //obj
  un=function(){
    console.log(this) //没有宿主对象,默认是window
    setTimeout(()=>{
    console.log(this) //定义它对象的obj是window
  })
  }
  un()
}
}
obj.say()

6.严格模式下的混用
箭头存在其中依然是undefinde
严格模式下,没有宿主调用的函数中的this是undefined!!!所以箭头函数中的也是undefined!

继承:

  call和apply一般情况下我们都是用来做属性继承的。

  第一个参数都是 this的指向

  call第二个参数为一系列的值

  apply第二个参数为一个数组

Object.prototype.toString.call():检测一个复杂数据类型是一个什么样的类型
instanceof:判断一个对象是不是另一个对象创建出来的
typeof:只能判断基本数据类型 引用数据类型统计返回OBject

  原型:

  

prototype:
每一个函数里面都有一个prototype属性 这个属性叫做原型 这个原型指向一个对象 我们把这个对象叫做原型对象
  1、节约内存
  2、扩展属性和方法
  3、实现类的继承
原型对象里面有2个东西
  constructor:构造器-->作用指向创建自己的那个构造函数
  __proto__:__proto__属性指向的是创建自己的那个构造函数的原型

  1、每一个对象里面都会有一个__proto__这个属性
  2、__proto__指向了一个对象 这个对象是原型对象
  3、实例化对象可以直接访问__proto__里面的一些方法

    new person).__proto__==person.prototype
  原型链:
什么叫做原型链?
  原型链:由__proto__形成的链条
  Object里面的__proto__指向的是null 原型链的顶点

方法继承:后面改变在加会影响到前面的(引用传递)
1.原型继承 Man.prototype = Person.prototype 缺点:污染父级

function person(name,age) {
    this.name=name
    this.age=age
}

person.prototype.eat = function(){
}

person.prototype.sleep = function(){
}

function man(sex){
    this.sex=sex
}
console.log([person])
man.prototype=person.prototype
man.prototype.work = function(){};
p1=new man()
console.log(p1,[person])

2.原型拷贝:for(var attr in person.prototype){
man.prototype[attr]=person.prototype[attr]
}

function person(name,age) {
    this.name=name
    this.age=age
}
person.prototype.eat = function(){
}

person.prototype.sleep = function(){
}
function man(sex){
    this.sex=sex
}
console.log([person])
for(var key in person.prototype){
    man.prototype[key] = person.prototype[key];
}
man.prototype.work = function(){};
p1=new man()
console.log(p1,[person])

缺点:假设Person上面还有父级 那么我们的Man是无法访问到Person父级的原型上的方法

  
3.原型链继承(Man.prototype = new Person())
多了东西少了东西

person.prototype==new man.__proto__.__proto__

function person(name,age) {
    this.name=name
    this.age=age
}
person.prototype.eat = function(){
}

person.prototype.sleep = function(){
}
function man(sex){
    this.sex=sex
}
console.log([person])
man.prototype=new person()
man.prototype.work = function(){};
p1=new man()

4.混合继承:少了contructor 原型对象的指向也发生改变 而且还无缘无故多了好多东西
man.prototype = {
  constructor:man,
  //原型链继承
  __proto__:person.prototype
  }(因此改善)

5.寄生继承(间接继承)
利用的是原型链继承的基础
  function fn(){}
继承空的方法
  fn.prototype=person.prototype
因为它是纯净的只有里面的方法 不能直接Man.prototype = new fn() 这样也会污染
  Man.prototype = new fn()
  少了contructor 原型对象的指向也发生改变 而且还无缘无故多了好多东西
  改善(加contructor)
不能做到函数复用

原文地址:https://www.cnblogs.com/lianqing/p/9073863.html

时间: 2024-10-05 06:31:31

浅谈面向对象和继承的相关文章

在Objective-C中浅谈面向对象

接触面向对象也有一段时间了,当时是通过C++学习的OOP,后来又接触到了PHP和Java.每种OOP的语言在面向对象上或多或少都会有不同的地方,现在在学习OC的面向对象部分,又感觉到OC面向对象的特点.写篇博文总结一下OC中的面向对象.刚接触OC,用OC中的便利初始化方法和便利构造器有点蹩脚,不过还可以在接受的范围之内,以下的东西可能会对面向对象的特征:抽象,封装,继承等总结的较少一些,主要总结了OC中面向对象的特点.在用到便利构造器的时候,如果之前学习过设计模式的话会好理解一些. 在下面的代码

浅谈面向对象之封装、继承、多态!如何使用内部类模拟多继承

[属性的封装] (1.)将属性进行私有化处理,不允许外部程序进行直接访问,并对外提供统一的方法,用于设置和读取私有属性: (2.)实现访问控制,限制属性访问,但不是拒绝访问. 作用:只能通过规定的方法访问数据,方便在方法中加入控制语句,防止不合法数据赋值. [封装] (1.)除了属性的封装之外,将需要重复使用的代码提取到方法中,这叫方法的封装:将相同的属性和方法抽象成一个类,这也是封装思想. [方法的重载] (1.)在同一个类中,方法名相同,参数列表不同,与返回值和访问修饰符无关的多个方法,构成

浅谈JavaScript中继承的实现

  谈到js中的面向对象编程,都有一个共同点,选择原型属性还是构造函数,两者各有利弊,而就片面的从js的对象创建以及继承的实现两个方面来说,官方所推荐的是两个相结合,各尽其责,各取其长,在前面的例子中,我已就在JavaScript中对象创建的方法做了一些总结,下面就其继承来道说一二:   1:原型链继承: 每一个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象内部的指针(默认的原型,所有默认类型都继承了Object,而这个继承也是用过原型链实现) fu

浅谈JS的继承

JS继承 继承是OO语言中最为人津津乐道的概念,许多OO语言都支持两种方式的继承:接口继承:实现继承. 接口继承:只继承方法签名. 实现继承:继承实际的方法. 由于ES里函数没有签名,所以在ES里面无法实现接口继承,ES只支持实现继承.                                                                                                                                    

虚拟世界(代码)--浅谈面向对象编程感触

不知不觉已经来到北京一年了,接触编程也一年了,或许我已经不再是那个连HelloWord都要写了N遍都不理解的低级菜鸟了(因为现在是中级了!!~~依旧是菜鸟) 在之前从来没有接触过编程,也不知道什么面向对象编程,面向过程编程.我的代码人生就是从这面向对象编程开始的. 面向对象编程,接触了C#和Java两种编程语言,感触良多(说实话,我现在已经快记不得老师讲过的有哪些重点了).我根据自己所了解的谈谈这段时间的收获. 一.什么是面向对象编程? 最初,老师告诉我们C#和Java都是面向对象编程的语言.那

Java系列1 -- 浅谈面向对象

也许每一个计算机专业的人,在大学学习java的时候,老师开始时都会说这么一句话,"Java是一门面向对象的语言".那么面向对象到底是什么,他有什么好处,或者他比其他流行的语言C/C++他强在哪里呢?“面向对象”在我们实际编程中有什么作用呢? 在开始实际的java之旅前,我们再次老生长谈下.我就按我自己的理解结合我这两年左右的编程经验来简单的说一说.其实在java之前我是学习C和C++的,但是并没有实际拿C或者C++写过什么项目,所以,一开始我就是直接用java的,在第一年的时候,我对面

浅谈面向对象

面向对象:顾名思义就是站在对象的角度思考问题,我们把多个功能合理的放到不同对象里,强调的是具备某些功能的对象. 具备某种功能的实体,称为对象, 面向对象很符合我们常规的思维方式,稳定性好,可重用性强,易于开发大型软件产品,有良好的可维护性和可拓展性. 面向对象的三大特征:封装,继承,多态 封装:影响对象的属性和实现细节,仅提供一个对外的接口,保证数据的安全性和完整性: 继承:实现一个类的时候可以在另外一个类的基础上实现,当子类继承父类后,子类是一种特殊的父类,能直接或间接获得父类里的成员,易于程

浅谈面向对象特征

所有的面相对象思想,归根结底是为了简化代码,减少代码量,构建更符合现实生活逻辑的程序代码,从而减轻程序员的负担.不能一味地或者说刻意地去使用面相对象的思想而忽略了程序所实现的功能或者框架,要根据实际情况 众所周知,面向对象编程的特点为:封装.继承.多态.C#是一门完全面向对象的语言,由于比Java推出的时间还要晚,所以对面向对象的思想的体现比Java还要完美,那么在C#中如何体现封装.继承和多态呢?下面举例并进行说明. 1.封装 封装的好处有以下几点: ①数据不外泄,可以做到一定的保护 ②类的使

浅谈面向对象开发原则:高内聚,低耦合

软件设计中通常用耦合度和内聚度作为衡量模块独立程度的标准.划分摸块的一个准则就是高内聚低耦合. 这是软件工程中的概念,是判断设计好坏的标准,主要是面向OO的设计,主要是看类的内聚性是否高,偶合度是否低. 每一个类完成特定的独立的功能,这个就是高内聚.耦合就是类之间的互相调用关系,如果耦合很强,互相牵扯调用很多,那么会牵一发而动全身,不利于维护和扩展. 类之间的设置应该要低耦合,但是每个类应该要高内聚.耦合是类之间相互依赖的尺度.如果每个对象都有引用其它所有的对象,那么就有高耦合,这是不合乎要求的