JS面向对象——面向对象知识

1. 程序设计的方法

常见的设计方法有面向流程与面向对象。

1.1 面向过程

以程序的过程为中心,采用自定而下逐步细化的方法来实现。常见的面向过程语言有 C


image.png

1.2 面向对象

将对象作为程序的基本单元,将程序分解为数据和操作的集合


image.png

1.3 面向对象编程的概念

一个对象通常可以由3个部分组成,分别是对象名(标识)、属性(静态特征)和操作(方法,动态特征)

  • 类(Class)
    类是具有相同属性和相同操作的对象的集合。
    每个对象都是类的一个实例。
    类通常由3部分组成,分别是类名、属性和操作(方法)。
    类一般都有实例,没有实例的类叫抽象类。抽象类相当于一个模版,由具体的类去继承和实现,抽象类的子类必须覆盖抽象类的所有方法之后才能被实例化,否则还是抽象类。

  • 对象(Object)

  • 类与对象的区别
    类是抽象的概念,仅仅代表事物的模板,比如说“女朋友”、“男朋友”。
    对象是一个能够“看得到,摸得着的”具体的实体,比如石榴姐。
    类是一个对象集合,是根据问题域抽象得来的,对象就是类的实列化,是一个有血有肉的个体。例如,鱼类是抽象的,金鱼就是这个类的一个对象。

class dog   //狗的类 有属性和方法
    {
        public string name;
        public void bark()
        {
            Console.WriteLine("汪汪,我的名字叫"+name);
        }
    }
            dog a = new dog();    类实例化---狗a(对象)
            a.name = "旺财";
            a.bark();
  • 属性(Property)

  • 方法(Method)

1.4 面向对象的三个基本特征是:封装、继承、多态

image.png
  • 封装

  • 继承

  • 多态
    在js中不能直接实现函数的重载,利用arguments实现重载
function test1() 
{ 
var text=""; 
if(arguments.length==1) 
{ 
//调用一个参数的方法 
} 
else if(arguments.length==2) 
{ 
//调用两个参数的方法 
} 
else { //其他的方法 
} 
}

2.JavaScript 面向对象

2.1 构造器(constructor)

对象的构造器,也可称之为构造类型

  • 系统定义好的
var o = new Object();
var a = new Array();
var d = new Date();
| |
object constructor
// 使用直接量创建
var o = {name: 'Xinyang'};
var a = [1, 2, 3];
  • 自定义构造器
// constructor
function Person(name, age, birthdate) {
      this.name = name;
      this.age = age;
      this.birthdate = birthdate;
      this.changeName = function(newAge) {
            this.age = newAge;
      }
}
// 创建对象
var X = new Person('Stupid', 13, new Date(2015, 01, 01));
var Q = new Person('Q', 12, new Date(2015, 01, 01));
X.changeName('X');
  • 创建构造器的方法(3 种)
//1)构造函数模式。
        function Person(name, job) { 
             this.name = name 
               this.job = job 
               this.sayName = function() { 
                  console.log(this.name) 
              } 
        } 
        var person1 = new Person('Jiang', 'student') 

//2)工厂模式
function createPerson(name,age,job){
    var o = new Object();
    o.name = name;
    o.age = age;
    o.job = job;
    o.sayName = function(){
        alert(this.name);
    }
    return o;
}
var person1 = createPerson("zhangsan",29,"soft engineer");
var person2 = createPerson("lisi",30,"hardware engineer");

//3)原型模式
function Person(){}
Person.prototype.name="小米";
Person.prototype.showName=function(){
          alert(this.name);
}
var person1=new Person();
person1.showName();
缺点:属性共享

//4)混合模型
构造函数模式定义实例属性,而原型模式用于定义方法和共享的属性
function CreatePerson(name){
this.name=name;
}
CreatePerson.prototype.showName=function(){
        alert(this.name);
}
var p1=new CreatePerson('小白');
p1.showName();
var p2=new CreatePerson('小绿');
p2.showName();

2.2原型继承

function Super(){
    this.name="小明";
}
Super.prototype.sayName = function(){
    console.log(this.name)
};

function Sub(){}
Sub.prototype = new Super();
var instance = new Sub();
instance.sayName();//小明

原型链继承的问题
当超类中包含引用类型属性值时,其中一个子类的多个实例中,只要其中一个实例引用属性只发生修改一个修改,其他实例的引用类型属性值也会立即发生改变,值类型修改不影响

 function Super(name){
        this.name=name;
        this.friends = ['小红','小强'];
    }
    Super.prototype.sayName = function(){
        console.log(this.name)
    };
    function Sub(){}
     
    Sub.prototype = new Super("小明");
    var instance1 = new Sub();
    var instance2 = new Sub();
    instance1.friends.push('张三');
    instance1.name="benben"
    console.log(instance1.friends);//["小红", "小强", "张三"]
    console.log(instance2.friends);//["小红", "小强", "张三"]
    console.log(instance2.name);//小明

无法实现多继承,即只能继承Super不能继承其他

2.3 构造函数继承

解决子类实例共享父类引用属性的问题
可以实现多继承(call多个父类对象)

function Super(){
      this.name="小明";
    this.friends = ['小红','小强'];
}
Super.prototype.sayName = function(){
    alert(this.name)
};
function Sub(){
    Super.call(this);
}
var instance1 = new Sub();
var instance2 = new Sub();
instance1.friends.push('张三');
console.log(instance1.friends);//["小红", "小强", "张三"]
console.log(instance2.friends);//["小红", "小强"]

存在的问题
只能继承父类的实例属性和方法,不能继承原型属性/方法

function Super(){
      this.name="小明";
    this.friends = ['小红','小强'];
}
Super.prototype.sayName = function(){
    alert(this.name)
};
function Sub(){
    Super.call(this);
}
var instance1 = new Sub();
instance1.sayName ()  //instance1.sayName is not a function
function Super(){
      this.name="小明";
    this.friends = ['小红','小强'];
  this.TellName = function(){
    alert(this.name)
};
}
Super.prototype.sayName = function(){
    alert(this.name)
};
function Sub(){
    Super.call(this);
}
var instance1 = new Sub();
var instance2 = new Sub();
instance1.friends.push('张三');
console.log(instance1.friends);//["小红", "小强", "张三"]
console.log(instance2.friends);//["小红", "小强"]
instance1.sayName ()  //instance1.sayName is not a function
instance1.TellName();

2.4组合式继承(原型继承+借用构造函数继承)常用方法

多了一个 Sub.prototype = new Super();
可以继承实例属性/方法,也可以继承原型属性/方法
不存在引用属性共享问题

        function Super(){
            this.name="小明";
            this.friends = ['小红','小强'];
        }
        Super.prototype.sayName = function(){
            alert(this.name)
        };
        function Sub(){
            Super.call(this);
        }
         
        Sub.prototype = new Super();
        var instance1 = new Sub();
        var instance2 = new Sub();
        instance1.friends.push('张三');
        console.log(instance1.friends);//["小红", "小强", "张三"]
        console.log(instance2.friends);//["小红", "小强"]
        instance1.sayName();//小明
        instance2.sayName();//小明

存在的问题


2.5寄生式继承

function createAnother(original){
    var clone = Object(original);//创建一个新对象,original的副本
    clone.sayName = function(){ //对象的增强,添加额外的方法
        alert('hi');
    }
    return clone;
}
var person = {
    name:'小明',
    friends:['小红','小强']
}
var person1 = createAnother(person);
var person2 = createAnother(person);
person1.friends.push('张三');
console.log(person.friends);//["小红", "小强", "张三"]
console.log(person1.friends);//["小红", "小强", "张三"]
console.log(person2.friends);//["小红", "小强", "张三"]

存在的问题


寄生组合式继承

function inheritPrototype(sub,superr){
var prototype = Object.create(superr.prototype);//ES5中创建对象副本的方法
    prototype.constructor = superr; //弥补重写原型失去的默认constructor属性
    sub.prototype = prototype;
}
function Super(name){
    this.name = name;
    this.friends = ['小红','小强'];
}
Super.prototype.sayName = function(){
    alert(this.name);
}
function Sub(name){
    Super.call(this,name);
}
inheritPrototype(Sub,Super);
var person1 = new Sub('小明');
var person2 = new Sub('小华');
person1.friends.push('张三');
console.log(person1.friends);//["小红", "小强", "张三"]
console.log(person2.friends);//["小红", "小强"]
console.log(person1.sayName());//小明
console.log(person2.sayName());//小华

2.7Class继承

  • class构造对象
class Student {
    constructor(name) {
        this.name = name;
    }
    hello() {
        alert('Hello, ' + this.name + '!');
    }
}
var xiaoming = new Student('小明');
xiaoming.hello();
  • class继承
class Point {
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }
  toString() {
    return '(' + this.x + ', ' + this.y + ')';
  }
}

class ColorPoint extends Point {
  constructor(x, y, color) {
    super(x, y); // 调用父类的constructor(x, y)
    this.color = color;
  }
  toString() {
    return this.color + ' ' + super.toString(); // 调用父类的toString()
  }
}

https://blog.csdn.net/weixin_40184249/article/details/80709949

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,193评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,306评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,130评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,110评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,118评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,085评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,007评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,844评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,283评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,508评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,395评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,985评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,630评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,797评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,653评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,553评论 2 352

推荐阅读更多精彩内容