js类三大属性,封装、继承、多态

news/2024/7/19 14:45:23 标签: js, 多态, 封装

继承、封装多态

构造函数:

在java语言中类的定义中都有构造函数,在js中也有构造函数的概念,Object对象都有constructor构造函数方法;

js中Object对象都有以下属性和方法:

1、constructor:构造函数属性,它指向了Object()函数;

2、hasOwnProperty:判断是否是对象自身属性和方法;

3、isPrototypeOf:判断是否是某个对象的子对象即继承某对象;


封装

首先,我们先了解一下什么是Js封装,就是当你需要隐藏一些属性和方法是,就可以将这些属性和方法封装起来,然后通过一个外部可以调用的特定接口(也可以说是一个公共的方法)进行调用。例如:

function Person(name , age , sex){
    this.name = name ; //共有变量 
    var age = age ;  //私有变量
    var sex = sex ; //私有变量
    this.show = function (){
        console.log(age+"===="+sex);
    }
}
var person = new Person('Sunshine',18,'女');
console.log(person.age);    // undefined
console.log(person.name);   // Sunshine
console.log(person.show());     // 18====女

请看代码后的注释,this指向的都是共有的属性和方法,而直接通过var声明的则属于私有变量(即外部不可访问变量),然后通过一个共有的show方法将私有的age和sex输出。当然show方法也要通过this声明才可以哟,否则的话show方法也是不可访问的。

继承

继承其实就是当多个方法存在相同的属性和方法是,就把这些相同的属性和方法提取到一个公共的方法中,通过原型prototype继承该方法,当然你也可以通过call或apply来继承该方法中的属性和方法。

function Person(name , age , sex){
    this.name = name ; 
    this.age = age ; 
    this.sex = sex ; 
    this.show = function (){
        console.log( this.age + "========"+ this.sex );
    }
}
function Student(name , age , sex , score){
    this.score = score ; 
    Person.apply(this,[name , age , sex]);
}
function Worker(name , age , sex , job){
    this.job = job ; 
    Person.call(this,name , age , sex);
}
Dancer.prototype = new Person('Sunshine',18,'女');
function Dancer(salary ){
    this.salary = salary ;
}
var student = new Student('Sunshine',18,'女',100);
var worker = new Worker('Sunshine',18,'女','IT');
var dancer = new Dancer(20000);
console.log(student);
console.log(worker);
console.log(dancer);

最终的结果如下:


多态

最后要说多态了,写这篇文章之前,自己对多态还是处于懵逼的状态,查阅了不少其他同行的博客,以及W3C 上的解释,把这些总结了一下,多态就是在执行同一操作且作用于不同对象时,返回不同的结果 。其实也就是把做什么和由谁去做分开,这样使得代码更容易维护,且条例清晰。直接上例子吧:

function dwn(s){
    document.write(s+"<br/>");
}
function Animal(){
    this.bite=function(){
        dwn("animal bite!");
    }
}
function Cat(){
    this.bite=function(){
        dwn("Cat bite!");
    }
}
Cat.prototype=new Animal(); ///inherit Animal
function Dog(){
    this.bite=function(){
        dwn("Dog bite");
    }
}   
Dog.prototype=new Animal();  ///inherit Animal
function AnimalBite(animal){
    if(animal instanceof Animal) //这里是判断animal的原型是否指向Animal
    animal.bite();
}
var cat = new Cat();
var dog = new Dog();
AnimalBite(cat);
AnimalBite(dog);
//最终输出的结果如下:
/*
    Cat bite!
    Dog bite
*/
终于写完了,如果以上有错误的话,欢迎指出~ 如果对你有所帮助的话,请给我一个小心心好吗~
↓↓↓ 个人写的一个公众号,还在完善中 ,欢迎加入↓↓↓ | ᴥ•́ )✧ ↓↓↓

在这里插入图片描述


http://www.niftyadmin.cn/n/1728115.html

相关文章

聊聊js原型那些事

原型详解 原型&#xff08;对象属性&#xff09; Javascript规定&#xff0c;每一个函数都有一个prototype对象属性&#xff0c;指向另一个对象&#xff08;原型链上面的&#xff09;。 prototype(对象属性)的所有属性和方法&#xff0c;都会被构造函数的实例继承。这意味着…

python实现浮点数二进制与十进制之间的转换

浮点数二进制与十进制之间的转换 在使用遗传算法的时候&#xff0c;需要对数据进制二进制编码&#xff0c;所以改的这个浮点数不同进制之间转换的一个代码 直接上代码 #二进制转化为十进制浮点数 def todecimal(n):把一个带小数的二进制数n转换成十进制小数点后面保留pre位小…

集成方法原理总结

集成学习 集成方法的目标是把多个使用给定学习算法构建的基估计器的预测结果结合起来&#xff0c;从而获得比单个估计器更好的泛化能力/鲁棒性。简单来说集成学习就是把若干个基学习器通过某种学习算法结合起来&#xff0c;进而达到比单个基学习更好的效果。 主要有两个问题&a…

浅谈js闭包理解

清晰理解js闭包 我们都知道&#xff0c;js的作用域分两种&#xff0c;全局和局部&#xff0c;基于我们所熟悉的作用域链相关知识&#xff0c;我们知道在js作用域环境中访问变量的权利是由内向外的&#xff0c;内部作用域可以获得当前作用域下的变量并且可以获得当前包含当前作…

随机森林RF原理总结

在集成学习原理中知道&#xff0c;集成学习分为两部分Bagging和Boosting。随机森林RF作为Bagging方法的典型例子&#xff0c;以其并行训练的优点在如今处理数据问题上广受欢迎。随机森林&#xff0c;顾名思义&#xff0c;是有多棵树组成的森林&#xff0c;故RF的弱学习器都是决…

js深拷贝与浅拷贝

关于js深浅拷贝 如何区分深拷贝与浅拷贝&#xff0c;简单点来说&#xff0c;就是假设B复制了A&#xff0c;当修改A时&#xff0c;看B是否会发生变化&#xff0c;如果B也跟着变了&#xff0c;说明这是浅拷贝&#xff0c;拿人手短&#xff0c;如果B没变&#xff0c;那就是深拷贝…

贝叶斯优化调参-Bayesian optimiazation原理加实践

随着机器学习用来处理大量数据被广泛使用&#xff0c;超参数调优所需要的空间和过程越来越复杂。传统的网格搜索和随即搜索已经不能满足用户的需求&#xff0c;因此方便快捷的贝叶斯优化调参越来越受程序员青睐。 1.贝叶斯优化原理介绍 贝叶斯优化用于机器学习调参由J. Snoek…

wepy框架的this绑定数据页面不重新渲染更新的解决办法

问题分析来源&#xff1a;数据绑定:data{title: i am old tilte } 1.在wepy中当单独设置this.title i am new title,页面数据没有更新.2.如果单独设置this.setData({title: i am new title})页面数据更新了,但是切换页面回来数据还是旧的.3.如果先设置this.setData({title: i …