JavaScript—面向对象、作用域

这篇具有很好参考价值的文章主要介绍了JavaScript—面向对象、作用域。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C#:从类继承

js:从对象继承

什么叫继承?

模板(类)

原型继承(实体)

有一个对象存在,构造函数设置原型为这个对象

创建出来的对象就继承与这个对象(从对象那里继承)

    <script type="text/javascript">       
        onload = function () {
           var Person= function(){
        this.say = function(){
                alert("你好");
        };
           };
           
           var p1= new Person();
           var p2 = new Person();
           
           p1.say();
        };
    </script>

此时p1、p2用的不是同一个say方法

JavaScript—面向对象、作用域,javascript,开发语言

方法与变量name、age等字段一样,占据了对象的内存

也就是说,每创建一个这样的函数,就会浪费一段这样的内存空间

什么是原型继承?

原型就是函数的prototype属性

   //使用继承后
   var Person = function(){
        
   };
   
   Person.prototype ={say:function(){
        alert("牛号");
   }};
   
   var p1 = new Person();
   var p2 = new Person();
   
   alert(p1.say===p2.say);   //打印true

js可以实现多继承

    <script type="text/javascript">       
        onload = function () {
           var inherite= function(name){
        this.name= name;
           };
           
           var o = {
                sayHello:function(){
                        alert("你好,我是"+ (this.name || "不存在"));
                }
           };
           
           o.sayHello();   //此时打印”你好,我是不存在“
           
           inherite.call(o,"赵晓虎");
           
           o.sayHello();  //此时打印”你好,我是赵晓虎“
        };
    </script>

原型链

JavaScript—面向对象、作用域,javascript,开发语言

如果需要原型,那么就一定要有函数

每一个对象有一个属性叫:_proto_

对象有原型,那么原型也是对象,原型也有原型

所有的函数是对象,继承自Function.prototype

Function.prototype是对象,继承自Object.prototype

Object.prototype是对象,继承自null

obj是对象,继承自Object.prototype

Function是对象,继承自Function.prototype

Function是函数,继承自Function.prototype


js成员的访问规则

O.方法( )

首先在o当前这个类型中寻找该成员的定义,如果存在该成员的定义,那么就直接使用该成员

如果该成员不在当前类型中,就访问其原型(原型链中的上一级)

以此类推,直到null位置

什么是js框架库?

使用js代码封装为一些文件,使用时只要引用进来即可

常见的js库

Prototype、YUI、Dojo、ExtJS、Jquery等


作用域

什么叫做作用域链?

多个函数嵌套,变量之间的作用域关系

作用域链(数组)

1、在script中表示第一个作用域链,我将其称为0链

2、凡是在该作用域链中的变量都是一个按照顺序存放的数组

3、如果有函数,表示在这个位置引出的第二个链,我记为1链

4、依此类推得到2链,3链等

在js中变量的访问规则是:

  1. 首先在当前作用域链中找到是否存在这个变量,如果存在直接使用这个变量
  2. 如果不存在,那么向上移级别(2链找1链)寻找该变量也是在上一个作用域链中寻找,那么找到就使用
  3. 如果没有就继续向上找,直到第0链,还没有就抛异常

如下面实例对应的作用域链

    <script type="text/javascript">
        var num = 234;
        var func = function () {
            var ff = function () {
                var num = 567;
                var f2 = function () {
                    num = 890;
                };
            };
            var num = 10;
            var f2 = function () {
                var num = "abc";
            };
        }
    </script>

JavaScript—面向对象、作用域,javascript,开发语言

在js中只支持函数作用域

    <script type="text/javascript">
        var f = function () {
            var f1 = function () {
                var num = 10;
                var f2 = function () {
                    alert(num);      //先找自己这一级有没有变量的声明,发现有,但是在它后面声明的,此时输出undefined
	       //num =20;   
                     var num = 20;
                    alert(num);      //输出20
                };
            };
        };
        f();
    </script>

变量会随时随地被覆盖

<script type="text/javascript">
        function a (){
                alert(a);  //此时打印的是这个函数
        }
        
        a();   
        var a = 10;
        alert(a);
</script>

常常会有些设计模式,变量容易被替换,我们的js代码就不安全。实际使用的时候,应该杜绝使用全局变量。

沙箱模式


闭包模拟对象

什么是闭包?

闭包像C#里面对象的私有变量。被包裹起来的一个东西,像墙一样。

函数就是闭包。函数作用域中的变量无法在外键访问,使用return将一个可以访问这个变量的对象返回到外界就形成一个闭包。

闭包用什么作用?

模拟对象

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
        <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
                <title></title>
                <style type="text/css">
                        
                </style>
                <script type="text/javascript" src="F:\study\instance\计算机\03 BS\02 蒋坤JavaScript基础视频教程\003_DOM_BOM-蒋坤\J.js"></script>
                <script type="text/javascript">
                        var Person =function(name ,age,sex){
                                return {
                                        get_Name:function(){
                                                return name;
                                        },
                                        get_Age:function(){
                                                return age;
                                        },
                                        get_Sex:function(){
                                                return sex;
                                        }
                                }
                        };
                        
                        var p= Person("赵晓虎",19,"男");
                        alert(p.get_Name());
                        p.set_Name("TigerZhao");
                        alert(p.get_Name());
                </script>
        </head>
        <body>
                
        </body>
</html>

闭包的劣势与处理方法


四种调用模式—函数与方法

  • 函数形态
  • 方法形态(将函数赋值给某一个对象的成员,那么就称为方法,this指当前对象)
  • 构造器形态,就是构造函数
  • 上下文形态

函数具有全局性

函数调用

this表示全局对象,在web中即window

方法调用

this表示当前对象

<script type="text/javascript">
        var foo = function(){
                alert(this);
        };
        
        var o={toString:function(){return "我是o对象";}};
        
        o.foo=foo;
        
        foo();
</script>

构造器形态

this表示当前创建对象

构造器就是构造函数
构造函数的执行过程有哪些?

Var p = new Person();

1、new创建了对象,并开辟了空间

2、将对象的引用地址传递给函数,在函数中用this接收

3、构造方法执行结束,返回this

改变的东西有哪些?

构造函数改变了函数的返回值

如果函数的返回值是一个对象,那么就按照返回值来返回

如果返回值不是一个对象就忽略返回值,直接返回this

var Person= function(){
        this.age=19;
        this.name="赵晓虎";
        return "{}";   //打印赵晓虎,返回的是一个字符串
        return {};     //打印undefined,此时返回的是一个对象
};

var p = new Person();
alert(p.name);

上下文调用模式

想用什么模式就用什么模式。this可以根据参数自定义

语法:函数.apply(对象,[参数列表])

函数.call(对象,参数列表)

call和apply有什么不同吗?

apply参数要求是一个数组,call要求是一个参数列表

传null是函数调用模式,{ }是方法调用模式文章来源地址https://www.toymoban.com/news/detail-680365.html

var foo1= function(){
        alert(this);
        return a>b? a:b;
};

var num = foo1.apply({},[112,23]);
var num = foo1.apply(null,[112,23]);
    <script type="text/javascript">       
        onload = function () {
           var Person = function(name){
        this.name= name;
        this.say= function(){
                alert("你好,我是"+this.name);
        };
           };			
           
           var p = new Person("刘亮亮");
           var p1 = new Person("赵晓虎");
           p.say.call(p);    //此时输出刘亮亮
           p.say.call(p1);   //此时输出赵晓虎
        };
    </script>

到了这里,关于JavaScript—面向对象、作用域的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • HarmonyOS 鸿蒙应用开发(十一、面向鸿蒙开发的JavaScript基础)

    ArkTS 是HarmonyOS(鸿蒙操作系统)原生应用开发的首选语言。它是用于构建用户界面的一种TypeScript方言,扩展了TypeScript以适应HarmonyOS生态系统的UI开发需求。ArkTS 融合了TypeScript的静态类型系统和现代UI框架的设计理念,为开发者提供了一种更安全高效的方式来编写HarmonyOS应用。

    2024年02月20日
    浏览(40)
  • 面向JavaScript开发人员的Adobe AIR与Dreamweaver

    入门教程,非常详细,CS4里面应该可以省略前面几步直接开发了。   Adobe AIR 对于 HTML/JavaScript 应用程序与桌面的集成有着出色的支持,但除了所有附加功能之外,还需要一些其他工具和技术。这篇文章探讨了使用 HTML/JavaScript 的 Web 开发与使用同样工具的应用程序开发之间的

    2024年02月08日
    浏览(47)
  • 掌握 JavaScript:从初学者到高级开发者的完整指南之JavaScript对象(二)

    可以大体分页3大类: 第一类:基本对象,我们主要学习Array和JSON和String 第二类:BOM对象,主要是和浏览器相关的几个对象 第三类:DOM对象,JavaScript中将html的每一个标签都封装成一个对象 1.1.1 基本对象 1.1.1.1 Array对象 语法格式 Array对象时用来定义数组的。常用语法格式有如下

    2024年02月07日
    浏览(45)
  • 开发语言漫谈-JavaScript

           JavaScript、Java名字很相近,但它们没有任何亲缘关系,是由不同公司开发的编程语言。Java由Sun公司(后被Oracle收购)开发,JavaScript最初是由Netscape公司开发的(当年浏览器的霸主)。JavaScript最初的名字是 LiveScript,Netscape将其命名为 JavaScript,无非是蹭 Java流量。当

    2024年04月16日
    浏览(37)
  • 【你也能从零基础学会网站开发】Web建站之javascript入门篇 浅谈JavaScript中的AJAX和XMLHttpRequest对象

    🚀 个人主页 极客小俊 ✍🏻 作者简介:程序猿、设计师、技术分享 🐋 希望大家多多支持, 我们一起学习和进步! 🏅 欢迎评论 ❤️点赞💬评论 📂收藏 📂加关注 什么是AJAX AJAX 其实就是 异步 JavaScript 及 XML(Asynchronous JavaScript and XML) AJAX 不是一种新的编程语言,而是一种

    2024年04月14日
    浏览(37)
  • 建站系列(五)--- 前端开发语言之HTML、CSS、JavaScript

    建站系列(一)— 网站基本常识 建站系列(二)— 域名、IP地址、URL、端口详解 建站系列(三)— 网络协议 建站系列(四)— Web服务器之Apache、Nginx 建站系列(五)— 前端开发语言之HTML、CSS、JavaScript 建站系列(六)— 后端开发语言 建站系列(七)— 常用前后端框架

    2024年02月09日
    浏览(40)
  • JavaScript之接口和面向接口编程

    曾探《JavaScript设计模式与开发实践》; 《javaScript设计模式与开发实践》笔记 什么是接口 ? 字面意义上的api接口,供外部使用,不需关注内部实现; 静态语言提供的 interface,为编写类提供一种契约,方便编译器检查; 面向接口编程的接口。 静态语言- 面向接口编程

    2024年02月13日
    浏览(26)
  • 面向对象【成员变量与局部变量、方法声明与作用】

    Java中的成员变量是指 类中声明的变量 ,也称为实例变量或属性。它们与方法一样属于类的成员,不同之处在于,它们存储在对象(堆)中而不是栈中,并且每个对象都有自己的一组值。 成员变量可以用来描述一个对象的状态,例如人的年龄、学生的姓名等。它们可以具有pub

    2024年02月10日
    浏览(50)
  • 【前端|Javascript第3篇】探秘JavaScript的作用域与作用域链:小白也能轻松搞懂!

    大家好!欢迎来到本篇博客,今天我们将解开JavaScript编程世界中的一道神秘面纱:作用域与作用域链。很多Javascript开发者并不真正理解它们,但这些概念对掌握Javascript至关重要。如果你对这些概念感到困惑,不要担心!本文将以通俗易懂的方式,用趣味横生的例子,为你详

    2024年02月13日
    浏览(31)
  • javascript基础七:说说你对Javascript中作用域的理解?

    一、作用域 作用域,即变量(变量作用域又称上下文)和函数生效(能被访问)的区域或集合 换句话说,作用域决定了代码区块中变量和其他资源的可见性 举个粟子 上述例子中,函数myFunction内部创建一个name变量,当我们在全局访问这个变量的时候,系统会报错 这就说明我

    2024年02月07日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包