js里面的new到底干了些什么

本文详细解析了如何在JavaScript中通过模拟new操作符的过程来创建对象,并探讨了函数返回值对new操作的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<script type="text/javascript">
var Person = function(name){
this.name = name;

};

//模仿new

var p = {};
p.__proto__ = Person.prototype;
Person.call(p);

</script>

__proto__只有火狐有,其它的浏览器是不开放的,像IE,__proto__这个名字就是一个不公开的prototype

function有一个可以公开的prototype

P如果找不到的属性会去找p.__proto__

Person.call(p);

就让this=p;那么this.name 就等于p.name

所以new 出来的Person 就会有属性name


下面我们看看function返回值对new的影响

如function b

如果返回一个{}

那么 var a = new b;

a 等于返回出来的{};

如果返回一个function 

那么a 等于返回出来的 function

如果返回一个[1,2,3,4]

那么a等于数组

如果返回 1,"df",undefine,true,则无视,返回对象实例

从这个规则上看,如果返回简单对象,如果返回类型为[object],[function]的话,则返回function里面返回的值.


<think>好的,我现在需要帮助用户了解JavaScript中WebSocket构造函数的参数。首先,我得回忆一下相关的知识,可能还需要查看一些资料或者之前的引用内容。 用户的问题是关于WebSocket构造函数的参数详解。根据提供的引用,比如引用[1]提到构造函数是通过new WebSocket('ws://localhost:8080')来创建实例的。这里参数明显是一个URL,所以URL肯定是第一个参数。接下来,有没有其他参数呢?我记得WebSocket构造函数可以接受可选的协议参数,比如子协议或者协议数组,作为第二个参数。 然后,我需要确认这些参数的具体含义和用法。第一个参数是URL,必须以ws或wss开头,分别代表非加密和加密连接。例如,ws://example.com/socket 或 wss://secure.example.com。第二个参数是可选的,可以是单个协议字符串,也可以是协议字符串数组,用来指定客户端希望使用的子协议,服务器会选择其中一个来使用。 接下来,查看用户提供的引用内容,确认是否有更多细节。引用[3]提到了在ES6类中封装WebSocket,构造函数里初始化this.ws = null和url,说明URL是必须传入的参数。而协议参数可能作为可选参数,在创建实例时传入。 另外,需要考虑错误处理,比如URL无效时会抛出异常,这点需要提醒用户。例如,如果URL的协议不是ws或wss,或者格式不正确,构造函数会抛出错误,所以建议使用try-catch块来处理。 可能还需要举一些例子,比如如何传入协议参数,比如['chat', 'file-transfer'],这样服务器可以根据支持的协议来选择。例如,当服务器支持'chat'协议时,连接会使用该协议。 最后,总结参数的作用,强调URL的必要性和协议的可选性,并指出错误处理的重要性。确保回答结构清晰,分点说明,并且引用提供的参考资料中的相关内容,比如引用[1]和引用[3]中的构造函数使用情况。</think>### JavaScript WebSocket 构造函数参数详解 在JavaScript中,`WebSocket`构造函数用于创建WebSocket连接实例,其参数定义和用法如下: #### 1. **基本语法** ```javascript const ws = new WebSocket(url [, protocols]); ``` - **`url`**(必填): 指定WebSocket服务器的地址,必须以 `ws://`(非加密)或 `wss://`(加密)开头。例如:`ws://localhost:8080` 或 `wss://api.example.com/chat`[^1]。 - **`protocols`**(可选): 支持两种形式: - **单个协议字符串**:如 `'chat'`; - **协议数组**:如 `['chat-v1', 'file-transfer']`,用于协商子协议。服务器会根据支持情况选择其中一个[^1][^3]。 #### 2. **参数详解** - **`url` 的格式要求** - 必须包含协议标识符(`ws`/`wss`); - 可包含路径参数,例如 `ws://example.com/ws?user=123`; - 若未指定端口,默认使用协议对应端口(`ws`为80,`wss`为443)。 - **`protocols` 的作用** 用于客户端与服务器协商通信规则,例如: ```javascript // 指定单一协议 const ws1 = new WebSocket('wss://example.com', 'binary'); // 指定多个协议供服务器选择 const ws2 = new WebSocket('wss://example.com', ['json', 'protobuf']); ``` 服务器通过响应头 `Sec-WebSocket-Protocol` 返回实际使用的协议,可通过 `ws.protocol` 属性获取。 #### 3. **错误处理** 若参数无效(如URL格式错误或协议不合法),构造函数会抛出 `SyntaxError` 或 `SecurityError`,建议使用 `try...catch` 捕获: ```javascript try { const ws = new WebSocket('invalid-url'); } catch (error) { console.error('连接失败:', error); } ``` #### 4. **示例代码** ```javascript // 创建加密连接并指定协议 const ws = new WebSocket('wss://chat.example.com', 'chat-v2'); // 监听连接建立事件 ws.onopen = () => { console.log('协议已协商:', ws.protocol); // 输出服务器选择的协议 }; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值